aboutsummaryrefslogtreecommitdiffstats
path: root/nlmessages.c
diff options
context:
space:
mode:
Diffstat (limited to 'nlmessages.c')
-rw-r--r--nlmessages.c210
1 files changed, 210 insertions, 0 deletions
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 <string.h>
+#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 (Num<Catalog->MsgCount)) 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; z<CtryCnt; z++)
+ if (NOT Read4(MsgFile,Ctrys+z)) error(ERdMsg);
+ if (NOT Read4(MsgFile,&MomPos)) error(ERdMsg);
+ if (DefPos==-1) { DefPos=MomPos; DefLength=MomLength; }
+#if defined(DOS_NLS) || defined (OS2_NLS)
+ for (z=0; z<CtryCnt; z++)
+ if (Ctrys[z]==NLSInfo.Country) Gotcha=True;
+#else
+ Gotcha=(strncasecmp(lcstring,str,strlen(str))==0);
+#endif
+ END
+ END
+ while ((*str!='\0') AND (NOT Gotcha));
+ if (*str=='\0') { MomPos=DefPos; MomLength=DefLength; }
+
+ /* read pointer table */
+
+ fseek(MsgFile,MomPos,SEEK_SET);
+ if (NOT Read4(MsgFile,&StrStart)) error(ERdMsg);
+ Catalog->MsgCount=(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; z<Catalog->MsgCount; 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