/* rescomp.c */ /*****************************************************************************/ /* AS-Portierung */ /* */ /* Compiler fuer Message-Dateien */ /* */ /* 17. 5.1998 Symbol gegen Mehrfachinklusion eingebaut */ /* 5. 7.1998 zusaetzliche Sonderzeichen */ /* */ /*****************************************************************************/ #include "stdinc.h" #include #include #include "endian.h" #include "strutil.h" #include "bpemu.h" /*****************************************************************************/ typedef struct _TMsgList { struct _TMsgList *Next; LongInt Position; char *Contents; } TMsgList,*PMsgList; typedef struct { PMsgList Messages,LastMessage; char *CtryName; LongInt *CtryCodes,CtryCodeCnt; LongInt FilePos,HeadLength,TotLength; } TMsgCat,*PMsgCat; typedef struct { char *AbbString,*Character; } TransRec; /*****************************************************************************/ #ifdef __TURBOC__ unsigned _stklen=16384; #endif static char *IdentString="AS Message Catalog - not readable\n\032\004"; static LongInt MsgCounter; static PMsgCat MsgCats; static LongInt CatCount,DefCat; static FILE *SrcFile,*MsgFile,*HFile; static char *IncSym; static TransRec TransRecs[]={ {"ä",CH_ae}, {"ë",CH_ee}, {"ï",CH_ie}, {"ö",CH_oe}, {"ü",CH_ue}, {"Ä",CH_Ae}, {"Ë",CH_Ee}, {"Ï",CH_Ie}, {"Ö",CH_Oe}, {"Ü",CH_Ue}, {"ß",CH_sz}, {"²",CH_e2}, {"µ",CH_mu}, {"à",CH_agrave}, {"À",CH_Agrave}, {"è",CH_egrave}, {"È",CH_Egrave}, {"ì",CH_igrave}, {"Ì",CH_Igrave}, {"ò",CH_ograve}, {"Ò",CH_Ograve}, {"ù",CH_ugrave}, {"Ù",CH_Ugrave}, {"á",CH_aacute}, {"Á",CH_Aacute}, {"é",CH_eacute}, {"É",CH_Eacute}, {"í",CH_iacute}, {"Í",CH_Iacute}, {"ó",CH_oacute}, {"Ó",CH_Oacute}, {"ú",CH_uacute}, {"Ú",CH_Uacute}, {"â",CH_acirc}, {"Â",CH_Acirc}, {"ê",CH_ecirc}, {"Ê",CH_Ecirc}, {"î",CH_icirc}, {"Î",CH_Icirc}, {"ô",CH_ocirc}, {"Ô",CH_Ocirc}, {"û",CH_ucirc}, {"Û",CH_Ucirc}, {"ç",CH_ccedil}, {"Ç",CH_Ccedil}, {"ñ",CH_ntilde}, {"Ñ",CH_Ntilde}, {"å",CH_aring}, {"Å",CH_Aring}, {"æ",CH_aelig}, {"&Aelig;",CH_Aelig}, {"¿",CH_iquest}, {"¡",CH_iexcl}, {"\\n","\n"}, {Nil,Nil}}; /*****************************************************************************/ typedef struct _TIncList { struct _TIncList *Next; FILE *Contents; } TIncList,*PIncList; PIncList IncList=Nil; static void GetLine(char *Dest) BEGIN PIncList OneFile; ReadLn(SrcFile,Dest); if (strncasecmp(Dest,"INCLUDE",7)==0) BEGIN OneFile=(PIncList) malloc(sizeof(TIncList)); OneFile->Next=IncList; OneFile->Contents=SrcFile; IncList=OneFile; strcpy(Dest,Dest+7); KillPrefBlanks(Dest); KillPrefBlanks(Dest); SrcFile=fopen(Dest,"r"); if (SrcFile==Nil) BEGIN perror(Dest); exit(2); END GetLine(Dest); END if ((feof(SrcFile)) AND (IncList!=Nil)) BEGIN fclose(SrcFile); OneFile=IncList; IncList=OneFile->Next; SrcFile=OneFile->Contents; free(OneFile); END END /*****************************************************************************/ static void SynError(char *LinePart) BEGIN fprintf(stderr,"syntax error : %s\n",LinePart); exit(10); END /*---------------------------------------------------------------------------*/ static void Process_LANGS(char *Line) BEGIN char NLine[1024],*p,*p2,*p3,*end,z,Part[1024]; PMsgCat PCat; int num; strmaxcpy(NLine,Line,1024); KillPrefBlanks(NLine); KillPostBlanks(NLine); p=NLine; z=0; while (*p!='\0') BEGIN for (; ((*p!='\0') AND (NOT isspace((unsigned int) *p))); p++); for (; ((*p!='\0') AND (isspace((unsigned int) *p))); p++); z++; END MsgCats=(PMsgCat) malloc(sizeof(TMsgCat)*(CatCount=z)); p=NLine; for (z=0,PCat=MsgCats; zMessages=Nil; PCat->TotLength=0; PCat->CtryCodeCnt=0; for (p2=p; ((*p2!='\0') AND (NOT isspace((unsigned int) *p2))); p2++); if (*p2=='\0') strcpy(Part,p); else BEGIN *p2='\0'; strcpy(Part,p); for (p=p2+1; ((*p!='\0') AND (isspace((unsigned int) *p2))); p++); END if (Part[strlen(Part)-1]!=')') SynError(Part); Part[strlen(Part)-1]='\0'; p2=strchr(Part,'('); if (p2==Nil) SynError(Part); *p2='\0'; PCat->CtryName=strdup(Part); p2++; do BEGIN for (p3=p2; ((*p3!='\0') AND (*p3!=',')); p3++); switch (*p3) BEGIN case '\0': num=strtol(p2,&end,10); p2=p3; break; case ',': *p3='\0'; num=strtol(p2,&end,10); p2=p3+1; break; default: num=0; END if (*end!='\0') SynError("numeric format"); PCat->CtryCodes=(PCat->CtryCodeCnt==0) ? (LongInt *) malloc(sizeof(LongInt)) : (LongInt *) realloc(PCat->CtryCodes,sizeof(LongInt)*(PCat->CtryCodeCnt+1)); PCat->CtryCodes[PCat->CtryCodeCnt++]=num; END while (*p2!='\0'); END END static void Process_DEFAULT(char *Line) BEGIN PMsgCat z; if (CatCount==0) SynError("DEFAULT before LANGS"); KillPrefBlanks(Line); KillPostBlanks(Line); for (z=MsgCats; zCtryName,Line)==0) break; if (z>=MsgCats+CatCount) SynError("unknown country name in DEFAULT"); DefCat=z-MsgCats; END static void Process_MESSAGE(char *Line) BEGIN char Msg[4096]; String OneLine; int l; PMsgCat z; TransRec *PRec; char *pos; PMsgList List; Boolean Cont; KillPrefBlanks(Line); KillPostBlanks(Line); if (HFile!=Nil) fprintf(HFile,"#define Num_%s %d\n",Line,MsgCounter); MsgCounter++; for (z=MsgCats; zAbbString!=Nil; PRec++) while ((pos=strstr(Msg,PRec->AbbString))!=Nil) BEGIN strcpy(pos,pos+strlen(PRec->AbbString)-1); *pos= *PRec->Character; END List=(PMsgList) malloc(sizeof(TMsgList)); List->Next=Nil; List->Position=z->TotLength; List->Contents=strdup(Msg); if (z->Messages==Nil) z->Messages=List; else z->LastMessage->Next=List; z->LastMessage=List; z->TotLength+=strlen(Msg)+1; END END /*---------------------------------------------------------------------------*/ int main(int argc, char **argv) BEGIN char Line[1024],Cmd[1024],*p,Save; PMsgCat z; TMsgCat TmpCat; PMsgList List; int c; time_t stamp; LongInt Id1,Id2; LongInt RunPos,StrPos; endian_init(); strutil_init(); if ((argc<3) OR (argc>4)) BEGIN fprintf(stderr,"usage: %s [header file]\n",*argv); exit(1); END SrcFile=fopen(argv[1],"r"); if (SrcFile==Nil) BEGIN perror(argv[1]); exit(2); END if (argc==4) BEGIN HFile=fopen(argv[3],"w"); if (HFile==Nil) BEGIN perror(argv[3]); exit(3); END IncSym=strdup(argv[3]); for (p=IncSym; *p!='\0'; p++) if (isalpha(((unsigned int) *p)&0xff)) *p=toupper(*p); else *p='_'; END else HFile=Nil; stamp=GetFileTime(argv[1]); Id1=stamp&0x7fffffff; Id2=0; for (c=0; c0) BEGIN TmpCat=MsgCats[0]; MsgCats[0]=MsgCats[DefCat]; MsgCats[DefCat]=TmpCat; END /* Startadressen String-Kataloge berechnen */ RunPos=ftell(MsgFile)+1; for (z=MsgCats; zHeadLength=strlen(z->CtryName)+1+4+4+(4*z->CtryCodeCnt)+4); for (z=MsgCats; zFilePos=RunPos; RunPos+=z->TotLength+(4*MsgCounter); END /* Country-Records schreiben */ for (z=MsgCats; zCtryName,1,strlen(z->CtryName)+1,MsgFile); Write4(MsgFile,&(z->TotLength)); Write4(MsgFile,&(z->CtryCodeCnt)); for (c=0; cCtryCodeCnt; c++) Write4(MsgFile,z->CtryCodes+c); Write4(MsgFile,&(z->FilePos)); END Save='\0'; fwrite(&Save,1,1,MsgFile); /* Stringtabellen schreiben */ for (z=MsgCats; zMessages; List!=Nil; List=List->Next) BEGIN StrPos=z->FilePos+(4*MsgCounter)+List->Position; Write4(MsgFile,&StrPos); END for (List=z->Messages; List!=Nil; List=List->Next) fwrite(List->Contents,1,strlen(List->Contents)+1,MsgFile); END /* faeaedisch... */ fclose(MsgFile); return 0; END #ifdef CKMALLOC #undef malloc #undef realloc void *ckmalloc(size_t s) BEGIN void *tmp=malloc(s); if (tmp==NULL) BEGIN fprintf(stderr,"allocation error(malloc): out of memory"); exit(255); END return tmp; END void *ckrealloc(void *p, size_t s) BEGIN void *tmp=realloc(p,s); if (tmp==NULL) BEGIN fprintf(stderr,"allocation error(realloc): out of memory"); exit(255); END return tmp; END #endif