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

📄 yacc.y

📁 早期freebsd实现
💻 Y
📖 第 1 页 / 共 2 页
字号:
	 */	if (flag) {	    for (i = list->min; i <= list->max; ++i)		r->types[i - r->min] |= flag;	}	free(list);	return;    }    if (list->min <= r->min && list->max >= r->max) {	/*	 * Superset case.  Make him big enough to hold us.	 * We might need to merge with the guy after him.	 */	if (flag) {	    list->types = xlalloc(list->max - list->min + 1);	    for (i = list->min; i <= list->max; ++i)		list->types[i - list->min] = flag;	    for (i = r->min; i <= r->max; ++i)		list->types[i - list->min] |= r->types[i - r->min];	    free(r->types);	    r->types = list->types;	} else {	    r->map = list->map;	}	r->min = list->min;	r->max = list->max;	free(list);    } else if (list->min < r->min) {	/*	 * Our tail intersects his head.	 */	if (flag) {	    list->types = xlalloc(r->max - list->min + 1);	    for (i = r->min; i <= r->max; ++i)		list->types[i - list->min] = r->types[i - r->min];	    for (i = list->min; i < r->min; ++i)		list->types[i - list->min] = flag;	    for (i = r->min; i <= list->max; ++i)		list->types[i - list->min] |= flag;	    free(r->types);	    r->types = list->types;	} else {	    r->map = list->map;	}	r->min = list->min;	free(list);	return;    } else {	/*	 * Our head intersects his tail.	 * We might need to merge with the guy after him.	 */	if (flag) {	    r->types = xrelalloc(r->types, list->max - r->min + 1);	    for (i = list->min; i <= r->max; ++i)		r->types[i - r->min] |= flag;	    for (i = r->max+1; i <= list->max; ++i)		r->types[i - r->min] = flag;	}	r->max = r->max;	free(list);    }    /*     * Okay, check to see if we grew into the next guy(s)     */    while ((lr = r->next) && r->max >= lr->min) {	if (flag) {	    if (r->max >= lr->max) {		/*		 * Good, we consumed all of him.		 */		for (i = lr->min; i <= lr->max; ++i)		    r->types[i - r->min] |= lr->types[i - lr->min];	    } else {		/*		 * "append" him on to the end of us.		 */		r->types = xrelalloc(r->types, lr->max - r->min + 1);		for (i = lr->min; i <= r->max; ++i)		    r->types[i - r->min] |= lr->types[i - lr->min];		for (i = r->max+1; i <= lr->max; ++i)		    r->types[i - r->min] = lr->types[i - lr->min];		r->max = lr->max;	    }	} else {	    if (lr->max > r->max)		r->max = lr->max;	}	r->next = lr->next;	if (flag)	    free(lr->types);	free(lr);    }}voiddump_tables(){    int x;    rune_list *list;    /*     * See if we can compress some of the istype arrays     */    for(list = types.root; list; list = list->next) {	list->map = list->types[0];	for (x = 1; x < list->max - list->min + 1; ++x) {	    if (list->types[x] != list->map) {		list->map = 0;		break;	    }	}    }    new_locale.invalid_rune = htonl(new_locale.invalid_rune);    /*     * Fill in our tables.  Do this in network order so that     * diverse machines have a chance of sharing data.     * (Machines like Crays cannot share with little machines due to     *  word size.  Sigh.  We tried.)     */    for (x = 0; x < _CACHED_RUNES; ++x) {	new_locale.runetype[x] = htonl(types.map[x]);	new_locale.maplower[x] = htonl(maplower.map[x]);	new_locale.mapupper[x] = htonl(mapupper.map[x]);    }    /*     * Count up how many ranges we will need for each of the extents.     */    list = types.root;    while (list) {	new_locale.runetype_ext.nranges++;	list = list->next;    }    new_locale.runetype_ext.nranges = htonl(new_locale.runetype_ext.nranges);    list = maplower.root;    while (list) {	new_locale.maplower_ext.nranges++;	list = list->next;    }    new_locale.maplower_ext.nranges = htonl(new_locale.maplower_ext.nranges);    list = mapupper.root;    while (list) {	new_locale.mapupper_ext.nranges++;	list = list->next;    }    new_locale.mapupper_ext.nranges = htonl(new_locale.mapupper_ext.nranges);    new_locale.variable_len = htonl(new_locale.variable_len);    /*     * Okay, we are now ready to write the new locale file.     */    /*     * PART 1: The _RuneLocale structure     */    if (fwrite((char *)&new_locale, sizeof(new_locale), 1, fp) != 1) {	perror(locale_file);	exit(1);    }    /*     * PART 2: The runetype_ext structures (not the actual tables)     */    list = types.root;    while (list) {	_RuneEntry re;	re.min = htonl(list->min);	re.max = htonl(list->max);	re.map = htonl(list->map);	if (fwrite((char *)&re, sizeof(re), 1, fp) != 1) {	    perror(locale_file);	    exit(1);	}        list = list->next;    }    /*     * PART 3: The maplower_ext structures     */    list = maplower.root;    while (list) {	_RuneEntry re;	re.min = htonl(list->min);	re.max = htonl(list->max);	re.map = htonl(list->map);	if (fwrite((char *)&re, sizeof(re), 1, fp) != 1) {	    perror(locale_file);	    exit(1);	}        list = list->next;    }    /*     * PART 4: The mapupper_ext structures     */    list = mapupper.root;    while (list) {	_RuneEntry re;	re.min = htonl(list->min);	re.max = htonl(list->max);	re.map = htonl(list->map);	if (fwrite((char *)&re, sizeof(re), 1, fp) != 1) {	    perror(locale_file);	    exit(1);	}        list = list->next;    }    /*     * PART 5: The runetype_ext tables     */    list = types.root;    while (list) {	for (x = 0; x < list->max - list->min + 1; ++x)	    list->types[x] = htonl(list->types[x]);	if (!list->map) {	    if (fwrite((char *)&list->types,		(list->max - list->min + 1)*sizeof(u_long), 1, fp) != 1) {		perror(locale_file);		exit(1);	    }	}        list = list->next;    }    /*     * PART 5: And finally the variable data     */    if (fwrite((char *)new_locale.variable,	       ntohl(new_locale.variable_len), 1, fp) != 1) {	perror(locale_file);	exit(1);    }    fclose(fp);    if (!debug)	return;    if (new_locale.encoding[0])	fprintf(stderr, "ENCODING	%s\n", new_locale.encoding);    if (new_locale.variable)	fprintf(stderr, "VARIABLE	%s\n", new_locale.variable);    fprintf(stderr, "\nMAPLOWER:\n\n");    for (x = 0; x < _CACHED_RUNES; ++x) {	if (isprint(maplower.map[x]))	    fprintf(stderr, " '%c'", maplower.map[x]);	else if (maplower.map[x])	    fprintf(stderr, "%04x", maplower.map[x]);	else	    fprintf(stderr, "%4x", 0);	if ((x & 0xf) == 0xf)	    fprintf(stderr, "\n");	else	    fprintf(stderr, " ");    }    fprintf(stderr, "\n");    for (list = maplower.root; list; list = list->next)	fprintf(stderr, "\t%04x - %04x : %04x\n", list->min, list->max, list->map);    fprintf(stderr, "\nMAPUPPER:\n\n");    for (x = 0; x < _CACHED_RUNES; ++x) {	if (isprint(mapupper.map[x]))	    fprintf(stderr, " '%c'", mapupper.map[x]);	else if (mapupper.map[x])	    fprintf(stderr, "%04x", mapupper.map[x]);	else	    fprintf(stderr, "%4x", 0);	if ((x & 0xf) == 0xf)	    fprintf(stderr, "\n");	else	    fprintf(stderr, " ");    }    fprintf(stderr, "\n");    for (list = mapupper.root; list; list = list->next)	fprintf(stderr, "\t%04x - %04x : %04x\n", list->min, list->max, list->map);    fprintf(stderr, "\nTYPES:\n\n");    for (x = 0; x < _CACHED_RUNES; ++x) {	u_long r = types.map[x];	if (r) {	    if (isprint(x))		fprintf(stderr, " '%c': %2d", x, r & 0xff);	    else		fprintf(stderr, "%04x: %2d", x, r & 0xff);	    fprintf(stderr, " %4s", (r & _A) ? "alph" : "");	    fprintf(stderr, " %4s", (r & _C) ? "ctrl" : "");	    fprintf(stderr, " %4s", (r & _D) ? "dig" : "");	    fprintf(stderr, " %4s", (r & _G) ? "graf" : "");	    fprintf(stderr, " %4s", (r & _L) ? "low" : "");	    fprintf(stderr, " %4s", (r & _P) ? "punc" : "");	    fprintf(stderr, " %4s", (r & _S) ? "spac" : "");	    fprintf(stderr, " %4s", (r & _U) ? "upp" : "");	    fprintf(stderr, " %4s", (r & _X) ? "xdig" : "");	    fprintf(stderr, " %4s", (r & _B) ? "blnk" : "");	    fprintf(stderr, " %4s", (r & _R) ? "prnt" : "");	    fprintf(stderr, " %4s", (r & _I) ? "ideo" : "");	    fprintf(stderr, " %4s", (r & _T) ? "spec" : "");	    fprintf(stderr, " %4s", (r & _Q) ? "phon" : "");	    fprintf(stderr, "\n");	}    }    for (list = types.root; list; list = list->next) {	if (list->map && list->min + 3 < list->max) {	    u_long r = list->map;	    fprintf(stderr, "%04x: %2d", list->min, r & 0xff);	    fprintf(stderr, " %4s", (r & _A) ? "alph" : "");	    fprintf(stderr, " %4s", (r & _C) ? "ctrl" : "");	    fprintf(stderr, " %4s", (r & _D) ? "dig" : "");	    fprintf(stderr, " %4s", (r & _G) ? "graf" : "");	    fprintf(stderr, " %4s", (r & _L) ? "low" : "");	    fprintf(stderr, " %4s", (r & _P) ? "punc" : "");	    fprintf(stderr, " %4s", (r & _S) ? "spac" : "");	    fprintf(stderr, " %4s", (r & _U) ? "upp" : "");	    fprintf(stderr, " %4s", (r & _X) ? "xdig" : "");	    fprintf(stderr, " %4s", (r & _B) ? "blnk" : "");	    fprintf(stderr, " %4s", (r & _R) ? "prnt" : "");	    fprintf(stderr, " %4s", (r & _I) ? "ideo" : "");	    fprintf(stderr, " %4s", (r & _T) ? "spec" : "");	    fprintf(stderr, " %4s", (r & _Q) ? "phon" : "");	    fprintf(stderr, "\n...\n");	    fprintf(stderr, "%04x: %2d", list->max, r & 0xff);	    fprintf(stderr, " %4s", (r & _A) ? "alph" : "");	    fprintf(stderr, " %4s", (r & _C) ? "ctrl" : "");	    fprintf(stderr, " %4s", (r & _D) ? "dig" : "");	    fprintf(stderr, " %4s", (r & _G) ? "graf" : "");	    fprintf(stderr, " %4s", (r & _L) ? "low" : "");	    fprintf(stderr, " %4s", (r & _P) ? "punc" : "");	    fprintf(stderr, " %4s", (r & _S) ? "spac" : "");	    fprintf(stderr, " %4s", (r & _U) ? "upp" : "");	    fprintf(stderr, " %4s", (r & _X) ? "xdig" : "");	    fprintf(stderr, " %4s", (r & _B) ? "blnk" : "");	    fprintf(stderr, " %4s", (r & _R) ? "prnt" : "");	    fprintf(stderr, " %4s", (r & _I) ? "ideo" : "");	    fprintf(stderr, " %4s", (r & _T) ? "spec" : "");	    fprintf(stderr, " %4s", (r & _Q) ? "phon" : "");	    fprintf(stderr, "\n");	} else 	for (x = list->min; x <= list->max; ++x) {	    u_long r = ntohl(list->types[x - list->min]);	    if (r) {		fprintf(stderr, "%04x: %2d", x, r & 0xff);		fprintf(stderr, " %4s", (r & _A) ? "alph" : "");		fprintf(stderr, " %4s", (r & _C) ? "ctrl" : "");		fprintf(stderr, " %4s", (r & _D) ? "dig" : "");		fprintf(stderr, " %4s", (r & _G) ? "graf" : "");		fprintf(stderr, " %4s", (r & _L) ? "low" : "");		fprintf(stderr, " %4s", (r & _P) ? "punc" : "");		fprintf(stderr, " %4s", (r & _S) ? "spac" : "");		fprintf(stderr, " %4s", (r & _U) ? "upp" : "");		fprintf(stderr, " %4s", (r & _X) ? "xdig" : "");		fprintf(stderr, " %4s", (r & _B) ? "blnk" : "");		fprintf(stderr, " %4s", (r & _R) ? "prnt" : "");		fprintf(stderr, " %4s", (r & _I) ? "ideo" : "");		fprintf(stderr, " %4s", (r & _T) ? "spec" : "");		fprintf(stderr, " %4s", (r & _Q) ? "phon" : "");		fprintf(stderr, "\n");	    }	}    }}

⌨️ 快捷键说明

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