2506 lines · 74.3 KB · C
RawDownload
/* 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.