/* nlmessages.c */ /*****************************************************************************/ /* AS-Portierung */ /* */ /* Einlesen und Verwalten von Meldungs-Strings */ /* */ /* Historie: 13. 8.1997 Grundsteinlegung */ /* 17. 8.1997 Verallgemeinerung auf mehrere Kataloge */ /* */ /*****************************************************************************/ #include "stdinc.h" #include #include "strutil.h" #include "endian.h" #include "bpemu.h" #include "nls.h" #include "nlmessages.h" /*****************************************************************************/ static char *IdentString="AS Message Catalog - not readable\n\032\004"; static char *EOpenMsg="cannot open msg file %s"; static char *ERdMsg="cannot read from msg file"; static char *EIndMsg="string table index error"; static TMsgCat DefaultCatalog={Nil,Nil,0}; /*****************************************************************************/ static void error(char *Msg) BEGIN fprintf(stderr,"message catalog handling: %s - program terminated\n",Msg); exit(255); END char *catgetmessage(PMsgCat Catalog, int Num) BEGIN static char umess[256]; if ((Num>=0) AND (NumMsgCount)) return Catalog->MsgBlock+Catalog->StrPosis[Num]; else BEGIN sprintf(umess,"Hey sie Sack, Message-Nummer %d gibbet nich!",Num); return umess; END END char *getmessage(int Num) BEGIN return catgetmessage(&DefaultCatalog,Num); END FILE *myopen(char *name, LongInt MsgId1, LongInt MsgId2) BEGIN FILE *tmpfile; String line; LongInt RId1,RId2; Boolean EForm=False; tmpfile=fopen(name,OPENRDMODE); if (tmpfile==Nil) return Nil; if (fread(line,1,strlen(IdentString),tmpfile)!=strlen(IdentString)) EForm=True; if (memcmp(line,IdentString,strlen(IdentString))!=0) EForm=True; if (NOT Read4(tmpfile,&RId1)) EForm=True; if (RId1!=MsgId1) EForm=True; if (NOT Read4(tmpfile,&RId2)) EForm=True; if (RId2!=MsgId2) EForm=True; if (EForm) BEGIN fclose(tmpfile); fprintf(stderr,"message catalog handling: warning: %s has invalid format or is out of date\n",name); return Nil; END else return tmpfile; END #define MSGPATHNAME "AS_MSGPATH" void opencatalog(PMsgCat Catalog, char *File, char *Path, LongInt MsgId1, LongInt MsgId2) BEGIN FILE *MsgFile; char str[2048],*ptr; #if defined(DOS_NLS) || defined (OS2_NLS) NLS_CountryInfo NLSInfo; #else char *lcstring; #endif LongInt DefPos= -1,MomPos,DefLength=0,MomLength,z,StrStart,CtryCnt,Ctrys[100]; Boolean fi,Gotcha; /* get reference for finding out which language set to use */ #if defined(DOS_NLS) || defined (OS2_NLS) NLS_GetCountryInfo(&NLSInfo); #else lcstring=getenv("LC_MESSAGES"); if (lcstring==Nil) lcstring=getenv("LC_ALL"); if (lcstring==Nil) lcstring=getenv("LANG"); if (lcstring==Nil) lcstring=""; #endif /* find first valid message file */ MsgFile=myopen(File,MsgId1,MsgId2); if (MsgFile==Nil) BEGIN if (*Path!='\0') BEGIN #ifdef _WIN32 for (ptr=Path; *ptr!='\0'; ptr++) if (*ptr=='/') *ptr='\\'; #endif ptr=strrchr(Path,PATHSEP); if (ptr==Nil) ptr=Path+strlen(Path); memcpy(str,Path,ptr-Path); str[ptr-Path]='\0'; strcat(str,SPATHSEP); strcat(str,File); MsgFile=myopen(str,MsgId1,MsgId2); END if (MsgFile==Nil) BEGIN ptr=getenv(MSGPATHNAME); if (ptr!=Nil) BEGIN sprintf(str,"%s/%s",ptr,File); MsgFile=myopen(str,MsgId1,MsgId2); END else BEGIN ptr=getenv("PATH"); if (ptr==Nil) MsgFile=Nil; else BEGIN strmaxcpy(str,ptr,255); ptr=FSearch(File,str); MsgFile=(*ptr!='\0') ? myopen(ptr,MsgId1,MsgId2) : Nil; END END if (MsgFile==Nil) BEGIN sprintf(str,"%s/%s",LIBDIR,File); MsgFile=myopen(str,MsgId1,MsgId2); if (MsgFile==Nil) BEGIN sprintf(str,EOpenMsg,File); error(str); END END END END Gotcha=False; do BEGIN ptr=str; do BEGIN if (fread(ptr,1,1,MsgFile)!=1) error(ERdMsg); fi=(*ptr=='\0'); if (NOT fi) ptr++; END while (NOT fi); if (*str!='\0') BEGIN if (NOT Read4(MsgFile,&MomLength)) error(ERdMsg); if (NOT Read4(MsgFile,&CtryCnt)) error(ERdMsg); for (z=0; zMsgCount=(StrStart-MomPos)>>2; Catalog->StrPosis=(LongInt *) malloc(sizeof(LongInt)*Catalog->MsgCount); Catalog->StrPosis[0]=0; if (fread(Catalog->StrPosis+1,4,Catalog->MsgCount-1,MsgFile)!=Catalog->MsgCount-1) error(ERdMsg); if (BigEndian) DSwap(Catalog->StrPosis+1,(Catalog->MsgCount-1)<<2); for (z=1; zMsgCount; z++) BEGIN Catalog->StrPosis[z]-=StrStart; if ((Catalog->StrPosis[z]<0) OR (Catalog->StrPosis[z]>=MomLength)) error(EIndMsg); END /* read string table */ fseek(MsgFile,StrStart,SEEK_SET); Catalog->MsgBlock=(char *) malloc(MomLength); if (fread(Catalog->MsgBlock,1,MomLength,MsgFile)!=MomLength) error(ERdMsg); fclose(MsgFile); END void nlmessages_init(char *File, char *ProgPath, LongInt MsgId1, LongInt MsgId2) BEGIN opencatalog(&DefaultCatalog,File,ProgPath,MsgId1,MsgId2); END