📄 parse.c
字号:
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 + -