dect
/
asl
Archived
13
0
Fork 0
This repository has been archived on 2022-02-17. You can view files and clone it, but cannot push or open issues or pull requests.
asl/nlmessages.c

211 lines
6.2 KiB
C

/* 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