/*========================================================================= MAIN.CPP Author: Gary Liddon @ Fareham Created: 3rd March 1999 Project: Theme Park World Playstation Purpose: Main module for Folio Copyright (c) 1998 G R Liddon ===========================================================================*/ /*---------------------------------------------------------------------- Includes -------- */ /* Std Lib ------- */ #include <vector> #include <conio.h> #include <sys/stat.h> #include <sys/utime.h> #include <fcntl.h> #include <io.h> /* Glib ---- */ #include <misc.hpp> #include <gfname.hpp> #include <gstring.hpp> #include <pcre.h> /* tplib ---- */ #include <trans.h> #include <lang.h> #include <script.h> /* local ---- */ #include "kanjiclass.h" /*---------------------------------------------------------------------- Version info 1.0 - 1.2 GL Initial working version 1.3 GL Longer line length (now 4096) 1.4 GL Added comments to file 1.5 GL Changed it so that \n are now returns 1.6 GL Added a slew of stuff to handle kanji 1.7 GL Chganged format of kanji table 1.8 GL Removed bug with kanji frame lookup 1.9 GL added -s so user can specify the size of output font 1.91 GL Transtext also writes out an ID text file (id.dat) 1.92 GL fixed bug with output kanji table being too short /*---------------------------------------------------------------------- /*---------------------------------------------------------------------- Tyepdefs && Defines ------------------- */ using namespace std; /*---------------------------------------------------------------------- Structure defintions -------------------- */ /*---------------------------------------------------------------------- Function Prototypes ------------------- */ static void usage(void); static char * cycleCommands(char *String,int Num); /*---------------------------------------------------------------------- Vars ---- */ static const float version=1.92f; static GString fileWithTranslations; static GString headerFile; static GString outDir; static GString g_japKanjiFile; static GString g_japLbmDir; static GString g_englishLbmsDir; static GString g_japLbmListFile; static int g_fontSize=0; /*---------------------------------------------------------------------- Data ---- */ /*---------------------------------------------------------------------- Function: Purpose: Params: Returns: ---------------------------------------------------------------------- */ int main(int argc, char ** argv) { cerr<<"GRLiddon() TRANSTEXT text translation stuphh "<<version<<endl; cerr<<"Copyright (c) 1999 G R Liddon. All rights reserved"<<endl<<endl; if (argc==1) usage(); else { CommandLine(argc,argv,cycleCommands); if (g_englishLbmsDir) { KanjiClass::writeEnglishFontLbms(g_englishLbmsDir,KanjiClass::KanjiFontSize(g_fontSize)); } if (fileWithTranslations) { AllTextDatabases myDatabases; myDatabases.readTranslationFile(fileWithTranslations); if (outDir) myDatabases.write(outDir); if (headerFile) myDatabases.writeHeaderFile(headerFile); /* Do some kanji jiggery pokery */ if (g_japKanjiFile || g_japLbmDir || g_japLbmListFile) { TextDatabase * jDataBase; int numOfStrings; KanjiClass kClass; jDataBase=myDatabases.getTextDataBase(JAPANESE); numOfStrings=jDataBase->getNumOfStrings(); for (int f=0;f<numOfStrings;f++) kClass.addStr((u8 const*)jDataBase->getText(f)); if (g_japLbmDir) { if (g_fontSize >=0 && g_fontSize < 3) kClass.saveKanjiLbms(g_japLbmDir,KanjiClass::KanjiFontSize(g_fontSize)); else GObject::Error(ERR_FATAL,"illegal font size parameter"); } if (g_japKanjiFile) kClass.saveKanjiTable(g_japKanjiFile); if (g_japLbmListFile && g_japLbmDir) kClass.saveKanjiLbmNames(g_japLbmDir,g_japLbmListFile); cout<<"text uses "<<kClass.howManyKanjiChars()<<endl; } } else GObject::Error(ERR_FATAL,"you must define a translation file"); } return(0); } /*---------------------------------------------------------------------- Function: void Usage(void) Notes: Usage of the util ---------------------------------------------------------------------- */ void usage(void) { cout<<"Usage: TRANSTEXT <in file> [ switches.. ]\n"; cout<<"Switches:\n"<<endl; cout<<"-o:<dir> Dir to save translation strings to"<<endl; cout<<"-e:<dir> Dir write ascii images to"<<endl; cout<<"-h:<file> File to save lang enums to"<<endl; cout<<endl; cout<<"-d:<dir> Dir to save kanji lbms to"<<endl; cout<<"-j:<file> File to save kanji table to"<<endl; cout<<"-p:<file> File to save list of saved lbms to"<<endl; cout<<endl; cout<<"-s:<0|1|2> Set the size of the output font"<<endl; cout<<endl; } /*---------------------------------------------------------------------- Function: Purpose: Params: ---------------------------------------------------------------------- */ GString getFileString(char const * Switch) { pcre * MyPattern; int Matches; const int NumOfOffsets=20; int Offsets[NumOfOffsets]; char const * ErrTxt; int ErrNum; char SwitchText[100]; MyPattern=pcre_compile("^-.:(.*)",0,&ErrTxt,&ErrNum,NULL); Matches=pcre_exec(MyPattern,NULL,Switch,strlen(Switch),0,Offsets,NumOfOffsets); if (Matches != 2) GObject::Error(ERR_FATAL,"Ill formatted switch %s",Switch); memcpy(SwitchText,&Switch[Offsets[2]],Offsets[3]-Offsets[2]); SwitchText[Offsets[3]-Offsets[2]]=0; return(GString(SwitchText)); } /*---------------------------------------------------------------------- Function: Purpose: Params: ---------------------------------------------------------------------- */ bool getPlusMinus(char const * Switch) { pcre * MyPattern; int Matches; const int NumOfOffsets=20; int Offsets[NumOfOffsets]; char const * ErrTxt; int ErrNum; MyPattern=pcre_compile("^-.([+|-])",0,&ErrTxt,&ErrNum,NULL); Matches=pcre_exec(MyPattern,NULL,Switch,strlen(Switch),0,Offsets,NumOfOffsets); if (Matches != 2) GObject::Error(ERR_FATAL,"Ill formatted switch %s",Switch); return(Switch[Offsets[2]]=='+'); } /*---------------------------------------------------------------------- Function: char *CycleCommands(char *String,int Num) Purpose: Callback to cycle through command line items Params: String = Text of item Num = Item number ---------------------------------------------------------------------- */ char * cycleCommands(char * cmdString,int num) { if (cmdString[0]=='-' || cmdString[0]=='/') { switch (cmdString[1]) { case 'e': g_englishLbmsDir=getFileString(cmdString); break; case 'h': headerFile=getFileString(cmdString); break; case 'o': outDir=getFileString(cmdString); break; case 'j': g_japKanjiFile=getFileString(cmdString); break; case 'd': g_japLbmDir=getFileString(cmdString); break; case 'p': g_japLbmListFile=getFileString(cmdString); break; case 's': g_fontSize=atoi(getFileString(cmdString)); break; default: GObject::Error(ERR_FATAL,"unknown switch %s",cmdString); break; } } else { if (fileWithTranslations) GObject::Error(ERR_FATAL,"translation file already defined as %s",(char const *)fileWithTranslations); else fileWithTranslations=cmdString; } return(cmdString); } /*=========================================================================== end */