/* text.c - Module to work with the text strings. ... 10-15-89 MHS More Autodoc and more asserts. */ #include #include #include #include #include #include #include "types.h" #include "text.h" #include "docfmt.h" #include "errstr.h" #include "misc.h" /* * @doc INTERNAL * * @func void | stripNewline | This function strips trailing white space. * * @parm char * | pch | Specifies the line to strip. * and trailing white space. * */ void stripNewline(char *pch) { int i; unsigned char *puch; assert(pch); i=strlen(pch); puch=(unsigned char *)pch; // so isspace always works while(i>=0) // process whole string from end { if(!isspace(puch[i])) // if it is evil, return; puch[i]='\0'; // nuke it --i; } } /* * @doc INTERNAL * * @func BOOL | getLine | This function gets a line from the file * specified by Input file structure and puts it into the line buffer. * * @parm EXTFile * | pExt | Specifies the file. * * @rdesc The return value is FALSE if there was an error * reading the file. * * @xref stripNewline */ BOOL getLine( EXTFile *pExt ) { if(!pExt->lineBuffer) // if it doesn't already exist, pExt->lineBuffer=my_malloc(MAXLINESIZE + 1); // make it if(!pExt->lineBuffer) { error(ERROR3); return (FALSE); } if( fgets(pExt->lineBuffer, MAXLINESIZE, pExt->fp) != NULL ) { /* replace the newline with a NULL */ stripNewline(pExt->lineBuffer); pExt->curlineno++; // increment line count pExt->curtag=0; // new line. no current tag. pExt->curlinepos=0; // start at beginning of line. return( TRUE ); } else { return( FALSE ); } } /* * @doc INTERNAL * * @func char * | lineText | This function tells if the line has any * text on it. * * @rdesc The return value is NULL if there is no text on the line. * It is the location of the text otherwise. */ char * lineText(char *pch) { while( (*pch) && *pch!='\n') { if( !isspace(*pch)) { return( pch ); } pch++; } return( NULL ); } /* * @doc INTERNAL * * @func char * | lineMake | This allocates the line structure, * sets the text string and nulls out the next feild of the structure. * * @parm char * | string | Specifies a pointer to the * string to be set up as a line processed. * * @rdesc The return value is a pointer to the line structure */ aLine * lineMake(string) char *string; { aLine *line; char *pch; int i; /* strip leading white space */ while(isspace(*string)) string++; i=0; pch=string; while(*pch) { i++; ++pch; } --pch; // get before \0 while(i>0 && isspace(*pch)) { *pch='\0'; // nuke white space at EOS --pch; --i; } /* make aLine structure */ line = (aLine *)my_malloc( 1 + strlen(string) + sizeof( aLine ) ); if( line == NULL ) { error(ERROR3); return( NULL ); } strcpy( line->text, string ); line->next = NULL; return( line ); } /* * @doc INTERNAL * * @func void | lineDestroy | This de-allocates the list of line structures. * * @parm aLine * | line | Specifies the head of the list. */ void lineDestroy( line ) aLine *line; { aLine *next; while( line != NULL ) { next = line->next; my_free( line ); line = next; } } /* * @doc INTERNAL * * @func void | lineAdd | This adds the given line to the list of * lines. * * @parm aLine * * | place | Specifies a the head of the list lines. * * @parm aLine * | line | Specifies the line to add. * * @comm The line is added to the end of the list. */ void lineAdd( place, line ) aLine * * place; aLine * line; { assert(place); while( *place != NULL ) { place = (aLine **)(*place); } *place = line; } /* * @doc INTERNAL * * @func aFlag * | flagAlloc | This allocates and nulls out * a flag structure; * * @rdesc The return value is a pointer to the flag structure */ aFlag * flagAlloc() { aFlag *flag; flag = (aFlag *)clear_alloc( sizeof( aFlag ) ); if( !flag ) { error(ERROR3); return( NULL ); } return( flag ); } /* * @doc INTERNAL * * @func void | flagDestroy | This de-allocates a list of flag structures. * * @parm aFlag *|flag| Specifies the head of the list to destroy. * * @xref lineDestroy */ void flagDestroy( flag ) aFlag *flag; { aFlag * next; while( flag ) { next = flag->next; lineDestroy( flag->name ); lineDestroy( flag->desc ); my_free( flag ); flag = next; } } /* * @doc INTERNAL * * @func void | flagAdd | This adds the given flag to the list of * flags. * * @parm aFlag * * | place | Specifies a pointer to the pointer * that is the list start * * @parm aFlag * | flag | Specifies the flag to add. */ void flagAdd( place, flag ) aFlag * * place; aFlag * flag; { if( place == NULL ) { return; } while( *place != NULL ) { place = &((*place)->next); } *place = flag; } /* * @doc INTERNAL * * @func aReg* | regAlloc | This allocates and nulls out * a reg structure; * * @rdesc The return value is a pointer to the parm structure */ aReg * regAlloc() { aReg *reg; reg = (aReg *)clear_alloc( sizeof( aReg ) ); if(! reg ) { error(ERROR3); return( NULL ); } return( reg ); } /* * @doc INTERNAL * * @func void | regAdd | This adds the given reg to the list of * reg. * * @parm aReg * * | place | Specifies the head of the list of regs. * * @parm aReg * | parm | Specifies the reg to add. * * @comm The register is added to the end of the list. */ void regAdd( aReg * * place, aReg * reg ) { if( place == NULL ) { return; } while( *place != NULL ) { place = &((*place)->next); } *place = reg; } /* * @doc INTERNAL * * @func void | regDestroy | This de-allocates a list of reg structures. * * @parm aReg * | reg | Specifies the head of the reg structure to destroy. * * @xref lineDestroy, flagDestroy * */ void regDestroy( aReg *reg ) { aReg * next; while( reg != NULL ) { next = reg->next; lineDestroy( reg->name ); // lineDestroy( reg->type ); lineDestroy( reg->desc ); flagDestroy( reg->flag ); my_free( reg ); reg = next; } } /* * @doc INTERNAL * * @func aCond* | condAlloc | This allocates and nulls out * a cond structure; * * @rdesc The return value is a pointer to the parm structure */ aCond * condAlloc() { aCond *cond; cond = (aCond *)clear_alloc( sizeof( aCond ) ); if(! cond ) { error(ERROR3); return( NULL ); } return( cond ); } /* * @doc INTERNAL * * @func void | condAdd | This adds the given cond to the list of * conds. * * @parm aCond * * | place | Specifies the head of the list of conds. * * @parm aCond * | parm | Specifies the cond to add. * * @comm The Condition is added to the end of the list. */ void condAdd( aCond * * place, aCond * cond ) { if( place == NULL ) { return; } while( *place != NULL ) { place = &((*place)->next); } *place = cond; } /* * @doc INTERNAL * * @func void | condDestroy | This de-allocates a list of cond structures. * * @parm aCond * | cond | Specifies the head of the cond structure to destroy. * * @xref lineDestroy, regDestroy * */ void condDestroy( aCond *cond ) { aCond * next; while( cond != NULL ) { next = cond->next; lineDestroy( cond->desc ); regDestroy( cond->regs ); my_free( cond ); cond = next; } } /* * @doc INTERNAL * * @func aParm * | parmAlloc | This allocates and nulls out * a parm structure; * * @rdesc The return value is a pointer to the parm structure */ aParm * parmAlloc() { aParm *parm; parm = (aParm *)clear_alloc( sizeof( aParm ) ); if(! parm ) { error(ERROR3); return( NULL ); } return( parm ); } /* * @doc INTERNAL * * @func void | parmDestroy | This de-allocates a list of parm structures. * * @parm aParm * |parm| Specifies the head of the parm structure to destroy. * * @xref lineDestroy, flagDestroy * */ void parmDestroy( parm ) aParm *parm; { aParm * next; while( parm != NULL ) { next = parm->next; lineDestroy( parm->name ); lineDestroy( parm->type ); lineDestroy( parm->desc ); flagDestroy( parm->flag ); my_free( parm ); parm = next; } } /* * @doc INTERNAL * * @func void | parmAdd | This adds the given parm to the list of * parms. * * @parm aParm * * | place | Specifies the head of the list of parms. * * @parm aParm * | parm | Specifies the parm to add. * * @comm The paramater is added to the end of the list. */ void parmAdd( place, parm ) aParm * * place; aParm * parm; { if( place == NULL ) { return; } while( *place != NULL ) { place = &((*place)->next); } *place = parm; } /* * @doc INTERNAL * * @func aField * | fieldAlloc | This allocates and nulls out * a structure; * * @rdesc The return value is a pointer to the structure */ aField * fieldAlloc() { aField *field; field = (aField *)clear_alloc( sizeof( aField ) ); if(! field ) { error(ERROR3); return( NULL ); } return( field ); } /* * @doc INTERNAL * * @func void | FieldDestroy | This de-allocates a list of Field structures. * * @Field aField * |Field| Specifies the head of the Field structure to destroy. * * @xref lineDestroy, flagDestroy * */ void fieldDestroy( Field ) aField *Field; { aField * next; while( Field ) { next = Field->next; switch(Field->wType) { case FIELD_TYPE: typeDestroy((aType *)Field->ptr); break; case FIELD_STRUCT: case FIELD_UNION: SUDestroy((aSU *)Field->ptr); break; default: fprintf(stderr,"INTERNAL ERROR: unknown field type in destroy!\n"); assert(FALSE); break; } my_free( Field ); Field = next; } } /* * @doc INTERNAL * * @func void | FieldAdd | This adds the given Field to the list of * Fields. * * @Field aField * * | place | Specifies the head of the list of Fields. * * @Field aField * | Field | Specifies the Field to add. * * @comm The paramater is added to the end of the list. */ void FieldAdd( place, Field ) aField * * place; aField * Field; { if( place == NULL ) { return; } while( *place != NULL ) { place = &((*place)->next); } *place = Field; } /* * @doc INTERNAL * * @func aField * | fieldAlloc | This allocates and nulls out * a structure; * * @rdesc The return value is a pointer to the structure */ aType * typeAlloc() { aType *type; type = (aType *)clear_alloc( sizeof( aType ) ); if(! type ) { error(ERROR3); return( NULL ); } return( type ); } /* * @doc INTERNAL * * @func void | FieldDestroy | This de-allocates a list of Field structures. * * @Field aField * |Field| Specifies the head of the Field structure to destroy. * * @xref lineDestroy, flagDestroy * */ void typeDestroy( type ) aType *type; { while( type ) { lineDestroy( type->name ); lineDestroy( type->type ); lineDestroy( type->desc ); flagDestroy( type->flag ); my_free( type ); type=NULL; } } /* * @doc INTERNAL * * @func aField * | fieldAlloc | This allocates and nulls out * a structure; * * @rdesc The return value is a pointer to the structure */ aSU * SUAlloc() { aSU *SU; SU = (aSU *)clear_alloc( sizeof( aSU ) ); if(! SU ) { error(ERROR3); return( NULL ); } return( SU ); } /* * @doc INTERNAL * * @func void | FieldDestroy | This de-allocates a list of Field structures. * * @Field aField * |Field| Specifies the head of the Field structure to destroy. * * @xref lineDestroy, flagDestroy * */ void SUDestroy( SU ) aSU *SU; { while( SU ) { lineDestroy( SU->name ); lineDestroy( SU->desc ); fieldDestroy( SU->field ); my_free( SU ); SU=NULL; } } /* * @doc INTERNAL * * @func aField * | fieldAlloc | This allocates and nulls out * a structure; * * @rdesc The return value is a pointer to the structure */ aOther * otherAlloc() { aOther *other; other = (aOther *)clear_alloc( sizeof( aOther ) ); if(! other ) { error(ERROR3); return( NULL ); } return( other ); } /* * @doc INTERNAL * * @func void | FieldDestroy | This de-allocates a list of Field structures. * * @Field aField * |Field| Specifies the head of the Field structure to destroy. * * @xref lineDestroy, flagDestroy * */ void otherDestroy( other ) aOther *other; { aOther * next; while( other ) { next = other->next; lineDestroy( other->name ); lineDestroy( other->desc ); lineDestroy( other->type ); my_free( other ); other = next; } } /* * @doc INTERNAL * * @func void | FieldAdd | This adds the given Field to the list of * Fields. * * @Field aField * * | place | Specifies the head of the list of Fields. * * @Field aField * | Field | Specifies the Field to add. * * @comm The paramater is added to the end of the list. */ void otherAdd( place, other ) aOther * * place; aOther * other; { if( place == NULL ) { return; } while( *place != NULL ) { place = &((*place)->next); } *place = other; }