strinttab.c

来自「这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易」· C语言 代码 · 共 66 行

C
66
字号
#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;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?