/* ** Read integer if exist before NEWLINE, ** but don't eat NEWLINE */ static Int16 TXTreadOptionalShort(struct TXTFILE *TXT) { static char name[9]; Int16 n,c=0,val=0; while(1) { if(TXTgetc(TXT,&c,&val)!=TRUE)return INVALIDINT; if(!(val & NEWLINE)) { if(val & SPACE) continue; /*skip space*/ if(val & STEQUAL) continue; /*skip '='*/ if(val & NUMBER) break; /*look for number*/ } TXTungetc(TXT); return INVALIDINT; /*not a number. abort*/ } name[0]=(char)c; for(n=1; n<256; n++ ) { if(TXTgetc(TXT,&c,&val)!=TRUE) break; if(val&NEWLINE) {TXTungetc(TXT);break;} if(val&SPACE)break; if(!(val&NUMBER)) ProgError("TR42", "%s(%ld): illegal char %s in number", fname (TXT->pathname), (long) TXT->Lines, quotechar (c)); if(n<8) name[n]=(char)c; } if(n<8)name[n]='\0'; name[8]='\0'; return (Int16)atoi(name); }
/*read string, skip space before, stop space/\n*/ static bool TXTread(struct TXTFILE *TXT, char name[8], int16_t valid) { int16_t c = 0, val = 0, n = 0; while (1) { if (!TXTgetc(TXT, &c, &val)) return false; if (val & NEWLINE) continue; if (val & SPACE) continue; if (val & valid) break; ProgError("TR11", "%s(%ld): illegal char %s", TXT->pathname, (long) TXT->Lines, quotechar(c)); } name[0] = (char) c; for (n = 1; n < 256; n++) { if (!TXTgetc(TXT, &c, &val)) break; if (val & SPACE) { TXTungetc(TXT); break; } if (!(val & valid)) ProgError("TR13", "%s(%ld): illegal char %s in word", TXT->pathname, (long) TXT->Lines, quotechar(c)); if (n < 8) name[n] = (char) c; } if (n < 8) name[n] = '\0'; return true; }
/* **TXTentryParse(name,filenam,&X,&Y,&Repeat,TXT,TRUE) */ Bool TXTentryParse(char *name,char *filenam,Int16 *x,Int16 *y,Bool *repeat, struct TXTFILE *TXT, Bool XY) { Int16 c=0,val=0; Bool comment; Int16 xx=INVALIDINT,yy=INVALIDINT; if(TXTreadIdent(TXT,name)!=TRUE) return FALSE; /* skip the equal*/ if(TXTgetc(TXT,&c,&val)!=TRUE) return FALSE; if(c!='=') TXTungetc(TXT); /* read integer*/ if(XY==TRUE) { xx=TXTreadOptionalShort(TXT); yy=TXTreadOptionalShort(TXT); } Normalise(filenam,name); TXTreadOptionalName(TXT,filenam); if(XY==TRUE) { if(xx==INVALIDINT) xx=TXTreadOptionalShort(TXT); if(yy==INVALIDINT) yy=TXTreadOptionalShort(TXT); } *repeat= TXTreadOptionalRepeat(TXT); *x=xx; *y=yy; for(comment=FALSE;;) { if(TXTgetc(TXT,&c,&val)!=TRUE)break; if(val & NEWLINE) break; if(val & COMMENT) /*eat commentaries*/ { comment=TRUE; continue;} if(val & SPACE) /*eat space*/ { continue;} if(comment==FALSE) ProgError("TR87", "%s(%ld): bad entry format", fname (TXT->pathname), (long) TXT->Lines); } return TRUE; }
/* ** STEQUAL is used to indicate alternate name */ static void TXTreadOptionalName(struct TXTFILE *TXT,char name[8]) { Int16 c=0,val=0; while(1) { if(TXTgetc(TXT,&c,&val)!=TRUE) return; if(!(val & NEWLINE)) { if(val & STEQUAL) continue; /*skip '='*/ if(val & SPACE) continue; /*skip space*/ if(val & (NAME&(~NUMBER))) break; } TXTungetc(TXT); return; /*name is NOT modified*/ } TXTungetc(TXT); if(TXTread(TXT,name,NAME|NUMBER)!=TRUE) { ProgError("TR32", "%s(%ld): invalid optional name", TXT->pathname, (long) TXT->Lines); } }
/* find '*' */ static bool TXTcheckStartPatch(struct TXTFILE *TXT) { int16_t c = 0, val = 0; if (!TXTgetc(TXT, &c, &val)) return false; if (val & STPATCH) return true; TXTungetc(TXT); return false; }
/* ** STPATCH is also used to indicate repetition */ static Bool TXTreadOptionalRepeat(struct TXTFILE *TXT) { Int16 c=0,val=0; while(1) { if(TXTgetc(TXT,&c,&val)!=TRUE) return FALSE; if(!(val & NEWLINE)) { if(val & STPATCH) break; /*look for STPATCH*/ if(val & SPACE) continue; /*skip space*/ } TXTungetc(TXT); return FALSE; } return TRUE; /*found*/ }
/*skip lines beginning with # or ; */ Bool TXTskipComment(struct TXTFILE *TXT) { Int16 c=0,val=0; Bool comment; for(comment=FALSE;;) { if(TXTgetc(TXT,&c,&val)!=TRUE)return FALSE; if(val & NEWLINE) /*eat newlines*/ { comment=FALSE; continue;} if(val & COMMENT) /*eat commentaries*/ { comment=TRUE; continue;} if(val & SPACE) /*eat space*/ { continue;} if(comment==FALSE) { TXTungetc(TXT);return TRUE;} } }
bool TXTentryParse(char *name, char *filenam, int16_t * x, int16_t * y, bool * repeat, struct TXTFILE * TXT, bool XY) { int16_t c = 0, val = 0; bool comment; int16_t xx = INVALIDINT, yy = INVALIDINT; if (!TXTreadIdent(TXT, name)) return false; /* skip the equal */ if (!TXTgetc(TXT, &c, &val)) return false; if (c != '=') TXTungetc(TXT); /* read integer */ if (XY) { xx = TXTreadOptionalShort(TXT); yy = TXTreadOptionalShort(TXT); } Normalise(filenam, name); TXTreadOptionalName(TXT, filenam); if (XY) { if (xx == INVALIDINT) xx = TXTreadOptionalShort(TXT); if (yy == INVALIDINT) yy = TXTreadOptionalShort(TXT); } *repeat = TXTreadOptionalRepeat(TXT); *x = xx; *y = yy; for (comment = false;;) { if (!TXTgetc(TXT, &c, &val)) break; if (val & NEWLINE) break; if (val & COMMENT) { /*eat commentaries */ comment = true; continue; } if (val & SPACE) { /*eat space */ continue; } if (!comment) ProgError("TR87", "%s(%ld): bad entry format", fname(TXT->pathname), (long) TXT->Lines); } return true; }
/* ** STPATCH is also used to indicate repetition */ static bool TXTreadOptionalRepeat(struct TXTFILE *TXT) { int16_t c = 0, val = 0; while (1) { if (!TXTgetc(TXT, &c, &val)) return false; if (!(val & NEWLINE)) { if (val & STPATCH) break; /*look for STPATCH */ if (val & SPACE) continue; /*skip space */ } TXTungetc(TXT); return false; } return true; /*found */ }
/*skip lines beginning with # or ; */ bool TXTskipComment(struct TXTFILE *TXT) { int16_t c = 0, val = 0; bool comment; for (comment = false;;) { if (!TXTgetc(TXT, &c, &val)) return false; if (val & NEWLINE) { /*eat newlines */ comment = false; continue; } if (val & COMMENT) { /*eat commentaries */ comment = true; continue; } if (val & SPACE) { /*eat space */ continue; } if (!comment) { TXTungetc(TXT); return true; } } }
/* find '*' */ static Bool TXTcheckStartPatch(struct TXTFILE *TXT) { Int16 c=0, val=0; if(TXTgetc(TXT,&c,&val)!=TRUE) return FALSE; if(val & STPATCH) return TRUE; TXTungetc(TXT); return FALSE; }