1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- /*
- * This file is part of the UCB release of Plan 9. It is subject to the license
- * terms in the LICENSE file found in the top-level directory of this
- * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
- * part of the UCB release of Plan 9, including this file, may be copied,
- * modified, propagated, or distributed except according to the terms contained
- * in the LICENSE file.
- */
- #include <u.h>
- #include <libc.h>
- #include <draw.h>
- #include <html.h>
- #include "impl.h"
- // Do case-insensitive lookup of key[0:keylen] in t[0:n] (key part),
- // returning 1 if found, 0 if not.
- // Array t must be sorted in increasing lexicographic order of key.
- // If found, return corresponding val in *pans.
- int
- _lookup(StringInt* t, int n, Rune* key, int keylen, int* pans)
- {
- int min;
- int max;
- int try;
- int cmpresult;
- min = 0;
- max = n - 1;
- while(min <= max) {
- try = (min + max)/2;
- cmpresult = _Strncmpci(key, keylen, t[try].key);
- if(cmpresult > 0)
- min = try + 1;
- else if(cmpresult < 0)
- max = try - 1;
- else {
- *pans = t[try].val;
- return 1;
- }
- }
- return 0;
- }
- // Return first key in t[0:n] that corresponds to val,
- // nil if none.
- Rune*
- _revlookup(StringInt* t, int n, int val)
- {
- int i;
- for(i = 0; i < n; i++)
- if(t[i].val == val)
- return t[i].key;
- return nil;
- }
- // Make a StringInt table out of a[0:n], mapping each string
- // to its index. Check that entries are in alphabetical order.
- StringInt*
- _makestrinttab(Rune** a, int n)
- {
- StringInt* ans;
- int i;
- ans = (StringInt*)emalloc(n * sizeof(StringInt));
- for(i = 0; i < n; i++) {
- ans[i].key = a[i];
- ans[i].val = i;
- assert(i == 0 || runestrcmp(a[i], a[i - 1]) >= 0);
- }
- return ans;
- }
|