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

📄 parse.c

📁 unix vnc 协议源码. VNC是一款远程控制工具软件.
💻 C
📖 第 1 页 / 共 2 页
字号:
	fatalerr("malloc()/realloc() failure in insert_defn()\n");    below = first = 0;    last = file->i_ndefs - 1;    while (last >= first)    {	/* Fast inline binary search */	register char *s1;	register char *s2;	register int middle = (first + last) / 2;	/* Fast inline strchr() */	s1 = name;	s2 = file->i_defs[middle]->s_name;	while (*s1++ == *s2++)	    if (s2[-1] == '\0') break;	/* If exact match, set sp and break */	if (*--s1 == *--s2) 	{	    sp = file->i_defs + middle;	    break;	}	/* If name > i_defs[middle] ... */	if (*s1 > *s2) 	{	    below = first;	    first = middle + 1;	}	/* else ... */	else	{	    below = last = middle - 1;	}    }    /* Search is done.  If we found an exact match to the symbol name,       just replace its s_value */    if (sp != NULL)    {	free((*sp)->s_value);	(*sp)->s_value = copy(val);	return;    }    sp = file->i_defs + file->i_ndefs++;    dest = file->i_defs + below + 1;    while (sp > dest)    {	*sp = sp[-1];	sp--;    }    stab = (struct symtab *) malloc(sizeof (struct symtab));    if (stab == NULL)	fatalerr("malloc()/realloc() failure in insert_defn()\n");    stab->s_name = copy(name);    stab->s_value = copy(val);    *sp = stab;}voiddefine(def, file)	char	*def;	struct inclist	*file;{    char *val;    /* Separate symbol name and its value */    val = def;    while (isalnum(*val) || *val == '_')	val++;    if (*val)	*val++ = '\0';    while (*val == ' ' || *val == '\t')	val++;    if (!*val)	val = "1";    define2(def, val, file);}struct symtab **slookup(symbol, file)	register char	*symbol;	register struct inclist	*file;{	register int first = 0;	register int last = file->i_ndefs - 1;	if (file) while (last >= first)	{	    /* Fast inline binary search */	    register char *s1;	    register char *s2;	    register int middle = (first + last) / 2;	    /* Fast inline strchr() */	    s1 = symbol;	    s2 = file->i_defs[middle]->s_name;	    while (*s1++ == *s2++)	        if (s2[-1] == '\0') break;	    /* If exact match, we're done */	    if (*--s1 == *--s2) 	    {	        return file->i_defs + middle;	    }	    /* If symbol > i_defs[middle] ... */	    if (*s1 > *s2) 	    {	        first = middle + 1;	    }	    /* else ... */	    else	    {	        last = middle - 1;	    }	}	return(NULL);}int merge2defines(file1, file2)	struct inclist	*file1;	struct inclist	*file2;{	if ((file1!=NULL) && (file2!=NULL))         {		int first1 = 0;		int last1 = file1->i_ndefs - 1;		int first2 = 0;		int last2 = file2->i_ndefs - 1;                int first=0;                struct symtab** i_defs = NULL;		int deflen=file1->i_ndefs+file2->i_ndefs;                if (deflen>0)                {                 	/* make sure deflen % SYMTABINC == 0 is still true */                	deflen += (SYMTABINC - deflen % SYMTABINC) % SYMTABINC;                	i_defs=(struct symtab**)			    malloc(deflen*sizeof(struct symtab*));                	if (i_defs==NULL) return 0;        	}        	while ((last1 >= first1) && (last2 >= first2))        	{	    		char *s1=file1->i_defs[first1]->s_name;	    		char *s2=file2->i_defs[first2]->s_name;     			if (strcmp(s1,s2) < 0)                        	i_defs[first++]=file1->i_defs[first1++];     			else if (strcmp(s1,s2) > 0)                        	i_defs[first++]=file2->i_defs[first2++];                        else /* equal */                        {                        	i_defs[first++]=file2->i_defs[first2++];                                first1++;                        }        	}        	while (last1 >= first1)        	{                        i_defs[first++]=file1->i_defs[first1++];        	}        	while (last2 >= first2)        	{                        i_defs[first++]=file2->i_defs[first2++];        	}                if (file1->i_defs) free(file1->i_defs);                file1->i_defs=i_defs;                file1->i_ndefs=first;                		return 1;  	}	return 0;}voidundefine(symbol, file)	char	*symbol;	register struct inclist	*file;{	register struct symtab **ptr;	struct inclist *srcfile;	while ((ptr = isdefined(symbol, file, &srcfile)) != NULL)	{	    srcfile->i_ndefs--;	    for (; ptr < srcfile->i_defs + srcfile->i_ndefs; ptr++)		*ptr = ptr[1];	}}intfind_includes(filep, file, file_red, recursion, failOK)	struct filepointer	*filep;	struct inclist		*file, *file_red;	int			recursion;	boolean			failOK;{	register char	*line;	register int	type;	boolean recfailOK;	while (line = x_getline(filep)) {		switch(type = deftype(line, filep, file_red, file, TRUE)) {		case IF:		doif:			type = find_includes(filep, file,				file_red, recursion+1, failOK);			while ((type == ELIF) || (type == ELIFFALSE) ||			       (type == ELIFGUESSFALSE))				type = gobble(filep, file, file_red);			if (type == ELSE)				gobble(filep, file, file_red);			break;		case IFFALSE:		case IFGUESSFALSE:		    doiffalse:			if (type == IFGUESSFALSE || type == ELIFGUESSFALSE)			    recfailOK = TRUE;			else			    recfailOK = failOK;			type = gobble(filep, file, file_red);			if (type == ELSE)			    find_includes(filep, file,					  file_red, recursion+1, recfailOK);			else			if (type == ELIF)			    goto doif;			else			if ((type == ELIFFALSE) || (type == ELIFGUESSFALSE))			    goto doiffalse;			break;		case IFDEF:		case IFNDEF:			if ((type == IFDEF && isdefined(line, file_red, NULL))			 || (type == IFNDEF && !isdefined(line, file_red, NULL))) {				debug(1,(type == IFNDEF ?				    "line %d: %s !def'd in %s via %s%s\n" : "",				    filep->f_line, line,				    file->i_file, file_red->i_file, ": doit"));				type = find_includes(filep, file,					file_red, recursion+1, failOK);				while (type == ELIF || type == ELIFFALSE || type == ELIFGUESSFALSE)					type = gobble(filep, file, file_red);				if (type == ELSE)					gobble(filep, file, file_red);			}			else {				debug(1,(type == IFDEF ?				    "line %d: %s !def'd in %s via %s%s\n" : "",				    filep->f_line, line,				    file->i_file, file_red->i_file, ": gobble"));				type = gobble(filep, file, file_red);				if (type == ELSE)					find_includes(filep, file,						file_red, recursion+1, failOK);				else if (type == ELIF)				    	goto doif;				else if (type == ELIFFALSE || type == ELIFGUESSFALSE)				    	goto doiffalse;			}			break;		case ELSE:		case ELIFFALSE:		case ELIFGUESSFALSE:		case ELIF:			if (!recursion)				gobble(filep, file, file_red);		case ENDIF:			if (recursion)				return(type);		case DEFINE:			define(line, file);			break;		case UNDEF:			if (!*line) {			    warning("%s, line %d: incomplete undef == \"%s\"\n",				file_red->i_file, filep->f_line, line);			    break;			}			undefine(line, file_red);			break;		case INCLUDE:			add_include(filep, file, file_red, line, FALSE, failOK);			break;		case INCLUDEDOT:			add_include(filep, file, file_red, line, TRUE, failOK);			break;		case ERROR:		case WARNING:		    	warning("%s: %d: %s\n", file_red->i_file,				 filep->f_line, line);		    	break;		    		case PRAGMA:		case IDENT:		case SCCS:		case EJECT:			break;		case -1:			warning("%s", file_red->i_file);			if (file_red != file)			    warning1(" (reading %s)", file->i_file);			warning1(", line %d: unknown directive == \"%s\"\n",				 filep->f_line, line);			break;		case -2:			warning("%s", file_red->i_file);			if (file_red != file)			    warning1(" (reading %s)", file->i_file);			warning1(", line %d: incomplete include == \"%s\"\n",				 filep->f_line, line);			break;		}	}	file->i_flags |= FINISHED;	return(-1);}

⌨️ 快捷键说明

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