⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 names.c

📁 linux virtual usb host source
💻 C
📖 第 1 页 / 共 2 页
字号:
		if (at->termt == termt)			return -1;	at = my_malloc(sizeof(struct audioterminal) + strlen(name));	if (!at)		return -1;	strcpy(at->name, name);	at->termt = termt;	at->next = audioterminals[h];	audioterminals[h] = at;	return 0;}static int new_genericstrtable(struct genericstrtable *t[HASHSZ], const char *name, unsigned int index){        struct genericstrtable *g;	unsigned int h = hashnum(index);        for (g = t[h]; g; g = g->next)                if (g->num == index)                        return -1;        g = my_malloc(sizeof(struct genericstrtable) + strlen(name));        if (!g)                return -1;        strcpy(g->name, name);        g->num = index;        g->next = t[h];        t[h] = g;        return 0;}static int new_hid(const char *name, u_int8_t hidd){	return new_genericstrtable(hiddescriptors, name, hidd);}static int new_reporttag(const char *name, u_int8_t rt){	return new_genericstrtable(reports, name, rt);}static int new_huts(const char *name, unsigned int data){	return new_genericstrtable(huts, name, data);}static int new_hutus(const char *name, unsigned int data){	return new_genericstrtable(hutus, name, data);}static int new_langid(const char *name, u_int16_t langid){	return new_genericstrtable(langids, name, langid);}static int new_physdes(const char *name, u_int8_t ph){	return new_genericstrtable(physdess, name, ph);}static int new_bias(const char *name, u_int8_t b){	return new_genericstrtable(biass, name, b);}static int new_countrycode(const char *name, unsigned int countrycode){	return new_genericstrtable(countrycodes, name, countrycode);}/* ---------------------------------------------------------------------- */#define DBG(x)static void parse(FILE *f){	char buf[512], *cp;	unsigned int linectr = 0;	int lastvendor = -1, lastclass = -1, lastsubclass = -1, lasthut=-1, lastlang=-1;	unsigned int u;	while (fgets(buf, sizeof(buf), f)) {		linectr++;		/* remove line ends */		if ((cp = strchr(buf, 13)))			*cp = 0;		if ((cp = strchr(buf, 10)))			*cp = 0;		if (buf[0] == '#' || !buf[0])			continue;		cp = buf;                if (buf[0] == 'P' && buf[1] == 'H' && buf[2] == 'Y' && buf[3] == 'S' && buf[4] == 'D' &&                    buf[5] == 'E' && buf[6] == 'S' && /*isspace(buf[7])*/ buf[7] == ' ') {                        cp = buf + 8;                        while (isspace(*cp))                                cp++;                        if (!isxdigit(*cp)) {                                fprintf(stderr, "Invalid Physdes type at line %u\n", linectr);                                continue;                        }                        u = strtoul(cp, &cp, 16);                        while (isspace(*cp))                                cp++;                        if (!*cp) {                                fprintf(stderr, "Invalid Physdes type at line %u\n", linectr);                                continue;                        }                        if (new_physdes(cp, u))                                fprintf(stderr, "Duplicate Physdes  type spec at line %u terminal type %04x %s\n", linectr, u, cp);                        DBG(printf("line %5u physdes type %02x %s\n", linectr, u, cp));                        continue;                }                if (buf[0] == 'P' && buf[1] == 'H' && buf[2] == 'Y' && /*isspace(buf[3])*/ buf[3] == ' ') {                        cp = buf + 4;                        while (isspace(*cp))                                cp++;                        if (!isxdigit(*cp)) {                                fprintf(stderr, "Invalid PHY type at line %u\n", linectr);                                continue;                        }                        u = strtoul(cp, &cp, 16);                        while (isspace(*cp))                                cp++;                        if (!*cp) {                                fprintf(stderr, "Invalid PHY type at line %u\n", linectr);                                continue;                        }                        if (new_physdes(cp, u))                                fprintf(stderr, "Duplicate PHY type spec at line %u terminal type %04x %s\n", linectr, u, cp);                        DBG(printf("line %5u PHY type %02x %s\n", linectr, u, cp));                        continue;                }                if (buf[0] == 'B' && buf[1] == 'I' && buf[2] == 'A' && buf[3] == 'S' && /*isspace(buf[4])*/ buf[4] == ' ') {                        cp = buf + 5;                        while (isspace(*cp))                                cp++;                        if (!isxdigit(*cp)) {                                fprintf(stderr, "Invalid BIAS type at line %u\n", linectr);                                continue;                        }                        u = strtoul(cp, &cp, 16);                        while (isspace(*cp))                                cp++;                        if (!*cp) {                                fprintf(stderr, "Invalid BIAS type at line %u\n", linectr);                                continue;                        }                        if (new_bias(cp, u))                                fprintf(stderr, "Duplicate BIAS  type spec at line %u terminal type %04x %s\n", linectr, u, cp);                        DBG(printf("line %5u BIAS type %02x %s\n", linectr, u, cp));                        continue;                }                if (buf[0] == 'L' && /*isspace(buf[1])*/ buf[1] == ' ') {                        cp =  buf+2;                        while (isspace(*cp))                                cp++;                        if (!isxdigit(*cp)) {                                fprintf(stderr, "Invalid LANGID spec at line %u\n", linectr);                                continue;                        }                        u = strtoul(cp, &cp, 16);                        while (isspace(*cp))                                cp++;                        if (!*cp) {                                fprintf(stderr, "Invalid LANGID spec at line %u\n", linectr);                                continue;                        }                        if (new_langid(cp, u))                                fprintf(stderr, "Duplicate LANGID spec at line %u language-id %04x %s\n", linectr, u, cp);                        DBG(printf("line %5u LANGID %02x %s\n", linectr, u, cp));                        lasthut = lastclass = lastvendor = lastsubclass = -1;                        lastlang = u;                        continue;                }		if (buf[0] == 'C' && /*isspace(buf[1])*/ buf[1] == ' ') {			/* class spec */			cp = buf+2;			while (isspace(*cp))				cp++;			if (!isxdigit(*cp)) {				fprintf(stderr, "Invalid class spec at line %u\n", linectr);				continue;			}			u = strtoul(cp, &cp, 16);			while (isspace(*cp))				cp++;			if (!*cp) {				fprintf(stderr, "Invalid class spec at line %u\n", linectr);				continue;			}			if (new_class(cp, u))				fprintf(stderr, "Duplicate class spec at line %u class %04x %s\n", linectr, u, cp);			DBG(printf("line %5u class %02x %s\n", linectr, u, cp));			lasthut = lastlang = lastvendor = lastsubclass = -1;			lastclass = u;			continue;		}		if (buf[0] == 'A' && buf[1] == 'T' && isspace(buf[2])) {			/* audio terminal type spec */			cp = buf+3;			while (isspace(*cp))				cp++;			if (!isxdigit(*cp)) {				fprintf(stderr, "Invalid audio terminal type at line %u\n", linectr);				continue;			}			u = strtoul(cp, &cp, 16);			while (isspace(*cp))				cp++;			if (!*cp) {				fprintf(stderr, "Invalid audio terminal type at line %u\n", linectr);				continue;			}			if (new_audioterminal(cp, u))				fprintf(stderr, "Duplicate audio terminal type spec at line %u terminal type %04x %s\n", linectr, u, cp);			DBG(printf("line %5u audio terminal type %02x %s\n", linectr, u, cp));			continue;		}		if (buf[0] == 'H' && buf[1] == 'C' && buf[2] == 'C' && isspace(buf[3])) {			/* HID Descriptor bCountryCode */                        cp =  buf+3;                        while (isspace(*cp))                                cp++;                        if (!isxdigit(*cp)) {                                fprintf(stderr, "Invalid HID country code at line %u\n", linectr);                                continue;                        }                        u = strtoul(cp, &cp, 10);                        while (isspace(*cp))                                cp++;                        if (!*cp) {                                fprintf(stderr, "Invalid HID country code at line %u\n", linectr);                                continue;                        }                        if (new_countrycode(cp, u))                                fprintf(stderr, "Duplicate HID country code at line %u country %02u %s\n", linectr, u, cp);                        DBG(printf("line %5u keyboard country code %02u %s\n", linectr, u, cp));                        continue;		}		if (isxdigit(*cp)) {			/* vendor */			u = strtoul(cp, &cp, 16);			while (isspace(*cp))				cp++;			if (!*cp) {				fprintf(stderr, "Invalid vendor spec at line %u\n", linectr);				continue;			}			if (new_vendor(cp, u))				fprintf(stderr, "Duplicate vendor spec at line %u vendor %04x %s\n", linectr, u, cp);			DBG(printf("line %5u vendor %04x %s\n", linectr, u, cp));			lastvendor = u;			lasthut = lastlang = lastclass = lastsubclass = -1;			continue;		}		if (buf[0] == '\t' && isxdigit(buf[1])) {			/* product or subclass spec */			u = strtoul(buf+1, &cp, 16);			while (isspace(*cp))				cp++;			if (!*cp) {				fprintf(stderr, "Invalid product/subclass spec at line %u\n", linectr);				continue;			}			if (lastvendor != -1) {				if (new_product(cp, lastvendor, u))					fprintf(stderr, "Duplicate product spec at line %u product %04x:%04x %s\n", linectr, lastvendor, u, cp);				DBG(printf("line %5u product %04x:%04x %s\n", linectr, lastvendor, u, cp));				continue;			}			if (lastclass != -1) {				if (new_subclass(cp, lastclass, u))					fprintf(stderr, "Duplicate subclass spec at line %u class %02x:%02x %s\n", linectr, lastclass, u, cp);				DBG(printf("line %5u subclass %02x:%02x %s\n", linectr, lastclass, u, cp));				lastsubclass = u;				continue;			}			if (lasthut != -1) {				if (new_hutus(cp, (lasthut << 16)+u))					fprintf(stderr, "Duplicate HUT Usage Spec at line %u\n", linectr);				continue;			}			if (lastlang != -1) {                                if (new_langid(cp, lastlang+(u<<10)))                                        fprintf(stderr, "Duplicate LANGID Usage Spec at line %u\n", linectr);                                continue;                        }			fprintf(stderr, "Product/Subclass spec without prior Vendor/Class spec at line %u\n", linectr);			continue;		}		if (buf[0] == '\t' && buf[1] == '\t' && isxdigit(buf[2])) {			/* protocol spec */			u = strtoul(buf+2, &cp, 16);			while (isspace(*cp))				cp++;			if (!*cp) {				fprintf(stderr, "Invalid protocol spec at line %u\n", linectr);				continue;			}			if (lastclass != -1 && lastsubclass != -1) {				if (new_protocol(cp, lastclass, lastsubclass, u))					fprintf(stderr, "Duplicate protocol spec at line %u class %02x:%02x:%02x %s\n", linectr, lastclass, lastsubclass, u, cp);				DBG(printf("line %5u protocol %02x:%02x:%02x %s\n", linectr, lastclass, lastsubclass, u, cp));				continue;			}			fprintf(stderr, "Protocol spec without prior Class and Subclass spec at line %u\n", linectr);			continue;		}		if (buf[0] == 'H' && buf[1] == 'I' && buf[2] == 'D' && /*isspace(buf[3])*/ buf[3] == ' ') {			cp = buf + 4;                        while (isspace(*cp))                                cp++;                        if (!isxdigit(*cp)) {                                fprintf(stderr, "Invalid HID type at line %u\n", linectr);                                continue;                        }                        u = strtoul(cp, &cp, 16);                        while (isspace(*cp))                                cp++;                        if (!*cp) {                                fprintf(stderr, "Invalid HID type at line %u\n", linectr);                                continue;                        }                        if (new_hid(cp, u))                                fprintf(stderr, "Duplicate HID type spec at line %u terminal type %04x %s\n", linectr, u, cp);                        DBG(printf("line %5u HID type %02x %s\n", linectr, u, cp));                        continue;		}                if (buf[0] == 'H' && buf[1] == 'U' && buf[2] == 'T' && /*isspace(buf[3])*/ buf[3] == ' ') {                        cp = buf + 4;                        while (isspace(*cp))                                cp++;                        if (!isxdigit(*cp)) {                                fprintf(stderr, "Invalid HUT type at line %u\n", linectr);                                continue;                        }                        u = strtoul(cp, &cp, 16);                        while (isspace(*cp))                                cp++;                        if (!*cp) {                                fprintf(stderr, "Invalid HUT type at line %u\n", linectr);                                continue;                        }                        if (new_huts(cp, u))                                fprintf(stderr, "Duplicate HUT type spec at line %u terminal type %04x %s\n", linectr, u, cp);			lastlang = lastclass = lastvendor = lastsubclass = -1;			lasthut = u;                        DBG(printf("line %5u HUT type %02x %s\n", linectr, u, cp));                        continue;                }                if (buf[0] == 'R' && buf[1] == ' ') {                        cp = buf + 2;                        while (isspace(*cp))                                cp++;                        if (!isxdigit(*cp)) {                                fprintf(stderr, "Invalid Report type at line %u\n", linectr);                                continue;                        }                        u = strtoul(cp, &cp, 16);                        while (isspace(*cp))                                cp++;                        if (!*cp) {                                fprintf(stderr, "Invalid Report type at line %u\n", linectr);                                continue;                        }                        if (new_reporttag(cp, u))                                fprintf(stderr, "Duplicate Report type spec at line %u terminal type %04x %s\n", linectr, u, cp);                        DBG(printf("line %5u Report type %02x %s\n", linectr, u, cp));                        continue;                }                if (buf[0] == 'V' && buf[1] == 'T') {			/* add here */			continue;		}		fprintf(stderr, "Unknown line at line %u\n", linectr);	}}/* ---------------------------------------------------------------------- */int names_init(char *n){	FILE *f;	if (!(f = fopen(n, "r"))) {		return errno;	}	parse(f);	fclose(f);	return 0;}

⌨️ 快捷键说明

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