From 333b605b2afd472b823aeda0adf0e8b1ea9843c0 Mon Sep 17 00:00:00 2001 From: fishsoupisgood Date: Mon, 27 May 2019 02:41:51 +0100 Subject: initial commit from asl-1.41r8.tar.gz --- nlmessages.c | 210 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 nlmessages.c (limited to 'nlmessages.c') diff --git a/nlmessages.c b/nlmessages.c new file mode 100644 index 0000000..4610a23 --- /dev/null +++ b/nlmessages.c @@ -0,0 +1,210 @@ +/* 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 -- cgit v1.2.3