/* TODO: ---- HIGHEST PRIORITY ---- * #ifndef * #if/#elif - Bearbeitung * leere argument-/tokenlists erlauben * Anzahl der Argumente checken (auch zuviele ergeben einen Error) * bei REDEFINING und allowredefinition=0 tokenlist genau ueberpruefen * Aufteilen in mehrere Sourcen main.c pplists.c etc. * Einige Variablen umbenennen (x,y,i,j,l,n etc =8) ----------------------------------------------------------------- * Verbesserungen: * - Nach malloc()/vor free() ueberpruefen ob NULL-Pointer * - Statt per dlen per Ptr2EOL abfragen.. * Fragen an Volker: * - _ alleine ein Identifier ? Ja ---- LOWEST PRIORITY ---- * - Token loeschen, wenn nur noch TokenList benutzt wird. * - ParseIdent.. optimieren * - Rest optimieren =8) * - PreParsing umschreiben.. __LINE__ muss mit der echten * Zeilennummer uebereinstimmen (die LFs drinlassen) */ /* * PreProcessor * $VER: VBPP V0.00 (19 Sep 1995) * (w) 1995 by Thorsten Schaaps */ #include <time.h> #include "vbc.h"#include "vbpp.h" /*vb: */static char FILE_[]=__FILE__; /*vb: */char pp_version[] = "vbpp V0.00 (w) 1995 by Thorsten Schaaps"; /* #define MAXIFNESTING 1024 *//*vb: ifnesting==incnesting */ FILE *in[MAXINCNESTING]; /* Sourcefiles */int zn[MAXINCNESTING]; /* Zeilennummern */char *filenames[MAXINCNESTING]; /* Filenamen */int incnesting; /* aktuelle Verschachtelungstiefe */unsigned long linenr; /* Zeilennummer */ char *incpath[MAXINCPATHS] ={"vinclude:"}; /* Includepfade */ int incpathc = 1; /* Anzahl der Includepfade */ char ppstring[MAXPPINPUT]; int cmtnesting = 0; /* aktuelle Kommentar-Versch.-Tiefe */ /*int ifnesting; *//*vb: *//* aktuelle IF-Tiefe *//*vb: ifnesting==incnesting */short ifstatus[MAXINCNESTING]; /* Array fuer Status-Verschachtelung */int if_cnt; /* Zaehler fuer #if's waehrend do_output=0 */int abs_if_cnt; /* zaehlt auch waehrend do_output */ int do_output = 1; /* Flag zur Erzeugung eines Outputs */ struct strnode *strlist; struct mnode *mlist; int did_expand; /* Temporaere Debugging-Routinen */void PrintSN(struct strnode *tl){ switch (tl->type) { case NORMAL: printf(" Normal........:"); break; case PP_IDENT: printf(" Identifier....:"); break; case ARGUMENT: printf(" Argument Nr.%2d:", tl->number); break; case NUMBER: printf(" Number........:"); break; case PP_STR: printf(" String........:"); break; case SPACE: printf(" Space.........:"); break; case SPECIAL: printf(" Special..Nr.%2d:", tl->flags); break; default: printf(" unknown..Nr.%2d:", tl->type); break; } printf(" %s\n", tl->str);}void PrintTL(struct strnode *tl){ #ifdef bla if (tl) { printf("TokenList:\n"); while (tl) { PrintSN(tl); tl = tl->next; } }#endif } /* ******* Listen-Funktionen ******* */ /* AddMakroNode - Fuegt eine Node an den Anfang einer Liste ein */void AddMakroNode(struct mnode **list, struct mnode *node){ if (DEBUG & 32) puts("AddMakroNode"); if (node) { node->prev = NULL; node->next = *list; *list = node; if (node->next) node->next->prev = node; }} /* AddStrNode - Fuegt eine Node in die Liste ein */void AddStrNode(struct strnode **list, struct strnode *node, char *str){ if (DEBUG & 32) puts("AddStrNode"); if (node || str) { if (!node) node = (struct strnode *) malloc(sizeof(struct strnode)); /* HIER: Rueckgabewert wegen Fehler ! */ if (!node) { error(196); } else { node->prev = NULL; node->next = *list; if (str) node->str = str; *list = node; if (node->next) node->next->prev = node; } }} /* AddStrNodeBehind - Fuegt eine Node ans Ende der Liste ein */void AddStrNodeBehind(struct strnode **list, struct strnode *node, char *str){ struct strnode *listnode; if (DEBUG & 32) puts("AddStrNodeBehind"); if (node || str) { if (!node) node = (struct strnode *) malloc(sizeof(struct strnode)); if (!node) { error(196); } else { if (!*list) { node->prev = NULL; node->next = NULL; *list = node; } else { listnode = *list; while (listnode->next) { listnode = listnode->next; } node->prev = listnode; node->next = NULL; listnode->next = node; } if (str) node->str = str; } }} /* RemMakroNode - Entfernt eine Node aus der Liste ohne sie zu loeschen */void RemMakroNode(struct mnode **list, struct mnode *node){ if (DEBUG & 32) puts("RemMakroNode"); if (node->prev) { if (node->next) node->next->prev = node->prev; node->prev->next = node->next; } else { if (node->next) node->next->prev = NULL; *list = node->next; } node->next = node->prev = NULL;} /* InsertMakroNode - Setzt eine Node hinter einer anderen ein */void InsertMakroNode(struct mnode **list, struct mnode *node, struct mnode *behind){ if (DEBUG & 32) puts("InsertMakroNode"); if (behind) { node->prev = behind; node->next = behind->next; behind->next = node; if (node->next) node->next->prev = node; } else AddMakroNode(list, node);} /* RemStrNode - Entfernt eine Node aus der Liste ohne sie zu loeschen */void RemStrNode(struct strnode **list, struct strnode *node){ if (DEBUG & 32) puts("RemStrNode"); if (node->prev) { if (node->next) node->next->prev = node->prev; node->prev->next = node->next; } else { if (node->next) node->next->prev = NULL; *list = node->next; } node->next = node->prev = NULL;} /* FindMakroNode - sucht den passenden Eintrag in der Liste * len=0 - der gesamte String muss uebereinstimmen * len>0 - die ersten len Zeichen muessen stimmen */struct mnode *FindMakroNode(struct mnode *list, char *str, int len){ if (DEBUG & 32) puts("FindMakroNode"); while (list) { if (len) { if ((strlen(list->name) == len) && (!strncmp(list->name, str, len))) return (list); } else { if (!strcmp(list->name, str)) return (list); } list = list->next; } return (0);} /* DelMakroNode - gibt den gesamten Speicher einer Node frei, ist list#NULL * wird die Node vorher aus der Liste entfernt */void DelMakroNode(struct mnode **list, struct mnode *node){ if (DEBUG & 32) puts("DelMakroNode"); if (node) { if (list && *list) RemMakroNode(list, node); if (node->name) free(node->name); if (node->args) free(node->args); if (node->token) free(node->token); if (node->tokenlist) DelStrList(&node->tokenlist); free(node); }} /* DelStrNode - gibt den gesamten Speicher einer Node frei, ist list#NULL * wird die Node vorher aus der Liste entfernt */void DelStrNode(struct strnode **list, struct strnode *node){ if (DEBUG & 32) puts("DelStrNode"); if (node) { if (list && *list) RemStrNode(list, node); if (node->str) free(node->str); free(node); }} void MergeStrNodes(struct strnode *prev, struct strnode *next){ /* next will now be deleted and prev->str will be */ /* the joined strings from prev&next */ char *newstr;/*vb: */ char c, *s, *d; if (DEBUG & 32) puts("MergeStrNodes"); newstr = (char *) malloc(prev->len + next->len + 1);/*vb: string-Routinen ersetzt (hoffentlich schneller) strcpy(newstr,prev->str); strcat(newstr,next->str); */ d = newstr; s = prev->str; do { c = *s++; *d++ = c; } while (c); d--; s = next->str; do { c = *s++; *d++ = c; } while (c); if (prev->str) free(prev->str); /*vb: wenn prev->str==0 knallts doch schon oben? */ prev->str = newstr; prev->len += next->len; DelStrNode(NULL, next);} /* DelMakroList - loescht eine gesamte Liste */void DelMakroList(struct mnode **list){ if (DEBUG & 32) puts("DelMakroList"); while (*list) DelMakroNode(list, *list); /* *list=NULL; *//*vb: *list==0 */} /* DelStrList - loescht eine gesamte Liste samt der Nodes/Strings */void DelStrList(struct strnode **list){ if (DEBUG & 32) puts("DelStrList"); while (*list) DelStrNode(list, *list); /* *list=NULL; *//*vb: *list==0 */} /* AllocSpace - erzeugt eine StrNode vom Typ Space */struct strnode *AllocSpace(){ struct strnode *newnode; char *newstr; if (DEBUG & 32) puts("AllocSpace"); newstr = (char *) malloc(2); if (newstr) { newstr[0] = ' '; newstr[1] = 0; newnode = (struct strnode *) malloc(sizeof(struct strnode)); if (newnode) { newnode->str = newstr; newnode->type = SPACE; newnode->len = 1; newnode->next = newnode->prev = NULL; newnode->flags = newnode->number = 0; return (newnode); } } return (NULL);} /* CloneStrList - erstellt eine exakte Kopie der Liste oder eines Ausschnittes *//* wenn listend#NULL */struct strnode *CloneStrList(struct strnode *list, struct strnode *listend){ struct strnode *prevnode = NULL, *newnode, *newlist = NULL; char *newstr; if (DEBUG & 32) puts("CloneStrList"); while (list) { newnode = (struct strnode *) malloc(sizeof(struct strnode)); if (!newnode) { DelStrList(&newlist); return (NULL); } newstr = (char *) malloc(list->len + 1); if (!newstr) { free(newnode); DelStrList(&newlist); return (NULL); } strcpy(newstr, list->str); newnode->str = newstr; newnode->len = list->len; newnode->flags = list->flags; newnode->type = list->type; newnode->number = list->number; newnode->next = NULL; newnode->prev = prevnode; if (prevnode) prevnode->next = newnode; else newlist = newnode; prevnode = newnode; if (listend && list == listend) list = NULL; else list = list->next; } return (newlist);} /* DoMakroFunction - erstellt eine StrList entsprechend des Function-Makros */struct strnode *DoMakroFunction(struct mnode *makro){ struct strnode *result = NULL; char *newstr = NULL, *timestr = NULL; int len, type; time_t timevalue; if (DEBUG & 32) puts("DoMakroFunction"); if (makro->flags & FUNCTION) { switch (makro->funcnum) { case FUNCLINE: newstr = (char *) malloc(11); if (!newstr)Lines 1–500 of 2506. Load more
/* TODO: ---- HIGHEST PRIORITY ---- * #ifndef * #if/#elif - Bearbeitung * leere argument-/tokenlists erlauben * Anzahl der Argumente checken (auch zuviele ergeben einen Error) * bei REDEFINING und allowredefinition=0 tokenlist genau ueberpruefen * Aufteilen in mehrere Sourcen main.c pplists.c etc. * Einige Variablen umbenennen (x,y,i,j,l,n etc =8) ----------------------------------------------------------------- * Verbesserungen: * - Nach malloc()/vor free() ueberpruefen ob NULL-Pointer * - Statt per dlen per Ptr2EOL abfragen.. * Fragen an Volker: * - _ alleine ein Identifier ? Ja ---- LOWEST PRIORITY ---- * - Token loeschen, wenn nur noch TokenList benutzt wird. * - ParseIdent.. optimieren * - Rest optimieren =8) * - PreParsing umschreiben.. __LINE__ muss mit der echten * Zeilennummer uebereinstimmen (die LFs drinlassen) */ /* * PreProcessor * $VER: VBPP V0.00 (19 Sep 1995) * (w) 1995 by Thorsten Schaaps */ #include <time.h> #include "vbc.h" #include "vbpp.h" /*vb: */ static char FILE_[]=__FILE__; /*vb: */ char pp_version[] = "vbpp V0.00 (w) 1995 by Thorsten Schaaps"; /* #define MAXIFNESTING 1024 *//*vb: ifnesting==incnesting */ FILE *in[MAXINCNESTING]; /* Sourcefiles */ int zn[MAXINCNESTING]; /* Zeilennummern */ char *filenames[MAXINCNESTING]; /* Filenamen */ int incnesting; /* aktuelle Verschachtelungstiefe */ unsigned long linenr; /* Zeilennummer */ char *incpath[MAXINCPATHS] = {"vinclude:"}; /* Includepfade */ int incpathc = 1; /* Anzahl der Includepfade */ char ppstring[MAXPPINPUT]; int cmtnesting = 0; /* aktuelle Kommentar-Versch.-Tiefe */ /*int ifnesting; *//*vb: *//* aktuelle IF-Tiefe */ /*vb: ifnesting==incnesting */ short ifstatus[MAXINCNESTING]; /* Array fuer Status-Verschachtelung */ int if_cnt; /* Zaehler fuer #if's waehrend do_output=0 */ int abs_if_cnt; /* zaehlt auch waehrend do_output */ int do_output = 1; /* Flag zur Erzeugung eines Outputs */ struct strnode *strlist; struct mnode *mlist; int did_expand; /* Temporaere Debugging-Routinen */ void PrintSN(struct strnode *tl) { switch (tl->type) { case NORMAL: printf(" Normal........:"); break; case PP_IDENT: printf(" Identifier....:"); break; case ARGUMENT: printf(" Argument Nr.%2d:", tl->number); break; case NUMBER: printf(" Number........:"); break; case PP_STR: printf(" String........:"); break; case SPACE: printf(" Space.........:"); break; case SPECIAL: printf(" Special..Nr.%2d:", tl->flags); break; default: printf(" unknown..Nr.%2d:", tl->type); break; } printf(" %s\n", tl->str); } void PrintTL(struct strnode *tl) { #ifdef bla if (tl) { printf("TokenList:\n"); while (tl) { PrintSN(tl); tl = tl->next; } } #endif } /* ******* Listen-Funktionen ******* */ /* AddMakroNode - Fuegt eine Node an den Anfang einer Liste ein */ void AddMakroNode(struct mnode **list, struct mnode *node) { if (DEBUG & 32) puts("AddMakroNode"); if (node) { node->prev = NULL; node->next = *list; *list = node; if (node->next) node->next->prev = node; } } /* AddStrNode - Fuegt eine Node in die Liste ein */ void AddStrNode(struct strnode **list, struct strnode *node, char *str) { if (DEBUG & 32) puts("AddStrNode"); if (node || str) { if (!node) node = (struct strnode *) malloc(sizeof(struct strnode)); /* HIER: Rueckgabewert wegen Fehler ! */ if (!node) { error(196); } else { node->prev = NULL; node->next = *list; if (str) node->str = str; *list = node; if (node->next) node->next->prev = node; } } } /* AddStrNodeBehind - Fuegt eine Node ans Ende der Liste ein */ void AddStrNodeBehind(struct strnode **list, struct strnode *node, char *str) { struct strnode *listnode; if (DEBUG & 32) puts("AddStrNodeBehind"); if (node || str) { if (!node) node = (struct strnode *) malloc(sizeof(struct strnode)); if (!node) { error(196); } else { if (!*list) { node->prev = NULL; node->next = NULL; *list = node; } else { listnode = *list; while (listnode->next) { listnode = listnode->next; } node->prev = listnode; node->next = NULL; listnode->next = node; } if (str) node->str = str; } } } /* RemMakroNode - Entfernt eine Node aus der Liste ohne sie zu loeschen */ void RemMakroNode(struct mnode **list, struct mnode *node) { if (DEBUG & 32) puts("RemMakroNode"); if (node->prev) { if (node->next) node->next->prev = node->prev; node->prev->next = node->next; } else { if (node->next) node->next->prev = NULL; *list = node->next; } node->next = node->prev = NULL; } /* InsertMakroNode - Setzt eine Node hinter einer anderen ein */ void InsertMakroNode(struct mnode **list, struct mnode *node, struct mnode *behind) { if (DEBUG & 32) puts("InsertMakroNode"); if (behind) { node->prev = behind; node->next = behind->next; behind->next = node; if (node->next) node->next->prev = node; } else AddMakroNode(list, node); } /* RemStrNode - Entfernt eine Node aus der Liste ohne sie zu loeschen */ void RemStrNode(struct strnode **list, struct strnode *node) { if (DEBUG & 32) puts("RemStrNode"); if (node->prev) { if (node->next) node->next->prev = node->prev; node->prev->next = node->next; } else { if (node->next) node->next->prev = NULL; *list = node->next; } node->next = node->prev = NULL; } /* FindMakroNode - sucht den passenden Eintrag in der Liste * len=0 - der gesamte String muss uebereinstimmen * len>0 - die ersten len Zeichen muessen stimmen */ struct mnode *FindMakroNode(struct mnode *list, char *str, int len) { if (DEBUG & 32) puts("FindMakroNode"); while (list) { if (len) { if ((strlen(list->name) == len) && (!strncmp(list->name, str, len))) return (list); } else { if (!strcmp(list->name, str)) return (list); } list = list->next; } return (0); } /* DelMakroNode - gibt den gesamten Speicher einer Node frei, ist list#NULL * wird die Node vorher aus der Liste entfernt */ void DelMakroNode(struct mnode **list, struct mnode *node) { if (DEBUG & 32) puts("DelMakroNode"); if (node) { if (list && *list) RemMakroNode(list, node); if (node->name) free(node->name); if (node->args) free(node->args); if (node->token) free(node->token); if (node->tokenlist) DelStrList(&node->tokenlist); free(node); } } /* DelStrNode - gibt den gesamten Speicher einer Node frei, ist list#NULL * wird die Node vorher aus der Liste entfernt */ void DelStrNode(struct strnode **list, struct strnode *node) { if (DEBUG & 32) puts("DelStrNode"); if (node) { if (list && *list) RemStrNode(list, node); if (node->str) free(node->str); free(node); } } void MergeStrNodes(struct strnode *prev, struct strnode *next) { /* next will now be deleted and prev->str will be */ /* the joined strings from prev&next */ char *newstr; /*vb: */ char c, *s, *d; if (DEBUG & 32) puts("MergeStrNodes"); newstr = (char *) malloc(prev->len + next->len + 1); /*vb: string-Routinen ersetzt (hoffentlich schneller) strcpy(newstr,prev->str); strcat(newstr,next->str); */ d = newstr; s = prev->str; do { c = *s++; *d++ = c; } while (c); d--; s = next->str; do { c = *s++; *d++ = c; } while (c); if (prev->str) free(prev->str); /*vb: wenn prev->str==0 knallts doch schon oben? */ prev->str = newstr; prev->len += next->len; DelStrNode(NULL, next); } /* DelMakroList - loescht eine gesamte Liste */ void DelMakroList(struct mnode **list) { if (DEBUG & 32) puts("DelMakroList"); while (*list) DelMakroNode(list, *list); /* *list=NULL; *//*vb: *list==0 */ } /* DelStrList - loescht eine gesamte Liste samt der Nodes/Strings */ void DelStrList(struct strnode **list) { if (DEBUG & 32) puts("DelStrList"); while (*list) DelStrNode(list, *list); /* *list=NULL; *//*vb: *list==0 */ } /* AllocSpace - erzeugt eine StrNode vom Typ Space */ struct strnode *AllocSpace() { struct strnode *newnode; char *newstr; if (DEBUG & 32) puts("AllocSpace"); newstr = (char *) malloc(2); if (newstr) { newstr[0] = ' '; newstr[1] = 0; newnode = (struct strnode *) malloc(sizeof(struct strnode)); if (newnode) { newnode->str = newstr; newnode->type = SPACE; newnode->len = 1; newnode->next = newnode->prev = NULL; newnode->flags = newnode->number = 0; return (newnode); } } return (NULL); } /* CloneStrList - erstellt eine exakte Kopie der Liste oder eines Ausschnittes */ /* wenn listend#NULL */ struct strnode *CloneStrList(struct strnode *list, struct strnode *listend) { struct strnode *prevnode = NULL, *newnode, *newlist = NULL; char *newstr; if (DEBUG & 32) puts("CloneStrList"); while (list) { newnode = (struct strnode *) malloc(sizeof(struct strnode)); if (!newnode) { DelStrList(&newlist); return (NULL); } newstr = (char *) malloc(list->len + 1); if (!newstr) { free(newnode); DelStrList(&newlist); return (NULL); } strcpy(newstr, list->str); newnode->str = newstr; newnode->len = list->len; newnode->flags = list->flags; newnode->type = list->type; newnode->number = list->number; newnode->next = NULL; newnode->prev = prevnode; if (prevnode) prevnode->next = newnode; else newlist = newnode; prevnode = newnode; if (listend && list == listend) list = NULL; else list = list->next; } return (newlist); } /* DoMakroFunction - erstellt eine StrList entsprechend des Function-Makros */ struct strnode *DoMakroFunction(struct mnode *makro) { struct strnode *result = NULL; char *newstr = NULL, *timestr = NULL; int len, type; time_t timevalue; if (DEBUG & 32) puts("DoMakroFunction"); if (makro->flags & FUNCTION) { switch (makro->funcnum) { case FUNCLINE: newstr = (char *) malloc(11); if (!newstr)