📄 rcp2c.c
字号:
/*
* @(#)pilrc.c
*
* Copyright 1997-1999, Wes Cherry (mailto:wesc@technosis.com)
* 2000-2001, Aaron Ardiri (mailto:aaron@ardiri.com)
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, please write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* Revisions:
* ==========
*
* pre 18-Jun-2000 <numerous developers>
* creation
* 18-Jun-2000 Aaron Ardiri
* GNU GPL documentation additions
* 23-Jun-2000 Mark Garlanger
* Additions to support #ifdef/#ifndef/#else/#endif in
* both *.rcp files and *.h files.
* 24-Jun-2000 Kurt Spaugh
* Additions for tSTL resource support
* 27-Jul-2000 Michal Kouril
* Additions for slider control resource support
* 20-Nov-2000 Renaud Malaval
* Additions for PalmOS 3.5 support
* 30-Nov-2000 Renaud Malaval
* Debug tSTL resource support in LE32 generation
* 05-Dec-2000 Renaud Malaval
* Remove padding in ParseDumpApplicationIconName() for resource taic
* Force padding to 16 bits in ParseDumpLauncherCategory() for resource tAIN
* 30-Dec-2000 Ben Combee
* Added 'tint' resource support
* Jan-2001 Regis Nicolas
* Merged 68K and LE32 version into one binary
* 12-Jan-2001 Renaud Malaval
* Added 'wrdl' resource support
* 19-Jan-2001 Renaud Malaval
* Added 'tclt' resource support
* 02-Fev-2001 Renaud Malaval
* Added 'silk' resource support
* 14-Fev-2001 Renaud Malaval
* Added 'cnty' resource support
* 16-Fev-2001 Renaud Malaval
* Added 'feat' resource support
* 23-Fev-2001 Renaud Malaval
* Added 'tkbd' resource support
* 02-Mar-2001 Renaud Malaval
* Added 'DLST' & 'BLST' resource support
* 09-Mar-2001 Renaud Malaval
* Added 'MIDI' resource support
* 12-Mar-2001 Renaud Malaval
* Added 'Tbsb' resource support
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
char *strdup(const char *s);
#define EMITRWT
#include "RCP2C.h"
#include "bitmap.h"
#include "font.h"
#include "restype.h" // RMa
#include "makeKbd.h" // RMa
#define idAutoInit 9999
#define idPalmOSReservedMin 10000
#define idPalmOSReservedMinWithEditIDs 10008
#include "YuLong\output.h"
/*-----------------------------------------------------------------------------
| Globals
-------------------------------------------------------------WESC------------*/
/*
* Are we PilRCUI -- this was an attempt to merge pilrc and pilrcui
*/
BOOL vfWinGUI;
/*
* Variables to support #ifdef/#else/#endif
*/
int ifdefSkipping = 0;
int ifdefLevel = 0;
/*
* No default flag for form and object form
*/
BOOL vfPalmRez;
/*
* Allow edit ID's (10000-10007 inclusive)
*/
BOOL vfAllowEditIDs;
/*
* Quiet output
*/
BOOL vfQuiet;
/*
* M$ (VS-type) error/warning output
*/
BOOL vfVSErrors;
/*
* Translations
*/
char *szLanguage;
TE *pteFirst;
/*
* RTL For Hebrew
*/
BOOL vfRTL = fFalse;
/*
* next auto id
*/
int idAutoMac = idAutoInit;
BOOL vfAutoId;
/*
* Warning about duplicates in forms and menus
*/
/*
* if == 2 then we warn about duplicate labels too
*/
BOOL vfCheckDupes;
/*
* Form globals
*/
FRM *vpfrm;
//RCFORM form; /* current form being parsed */
//#define cobjMax 256
//RCFORMOBJLIST rglt[cobjMax];
/*
* RMa Little or Big indian support
*/
BOOL vfLE32 = fFalse;
/*
* Menu globals
*/
RCMENUBAR menu;
#define imiMax 128
RCMENUITEM rgmi[imiMax];
#define impdMax 32
RCMENUPULLDOWN rgmpd[impdMax];
int imiMac;
int idMenu;
char *szMenuIdName;
#define iidMenuMax 128
int iidMenuMac;
int rgidMenu[iidMenuMax];
#define iidStringMax 512
int iidStringMac;
int rgidString[iidStringMax];
#define iidStringTableMax 384 // RMa add for make difference between tSTR and tSTL string
int iidStringTableMac; // RMa add for make difference between tSTR and tSTL string
int rgidStringTable[iidStringTableMax]; // RMa add for make difference between tSTR and tSTL string
#define iidAlertMax 512
int iidAlertMac;
int rgidAlert[iidAlertMax];
#define iidAISMax 128
int iidAISMac;
int rgidAIS[iidAISMax];
char szIdNameBuf[16384];
/*
* Symbol table
*/
SYM *psymFirst;
/*
* Parse globals
*/
BOOL fTokUngotten;
TOK tokPrev;
TOK tok;
int iline;
char szLine[4096];
/*
* Rect for Prev* keywords
*/
RCRECT rcPrev;
/*-----------------------------------------------------------------------------
| AddSym
|
| Add symbol with value wVal to symbol table
|
| Note! no check is made for previous existence
-------------------------------------------------------------WESC------------*/
VOID
AddSym(char *sz,
int wVal)
{
SYM *psym;
psym = calloc(1, sizeof(SYM));
psym->sz = strdup(sz);
psym->wVal = wVal;
psym->psymNext = psymFirst;
psymFirst = psym;
}
/*-----------------------------------------------------------------------------
| PsymLookup
|
| Lookup symbol based on sz -- case sensitive
-------------------------------------------------------------WESC------------*/
SYM *
PsymLookup(char *sz)
{
SYM *psym;
for (psym = psymFirst; psym != NULL; psym = psym->psymNext)
if (strcmp(psym->sz, sz) == 0)
return psym;
return NULL;
}
int
IdGetAutoId()
{
return idAutoMac--;
}
SYM *
PsymAddSymAutoId(char *sz)
{
SYM *psym;
AddSym(sz, IdGetAutoId());
psym = PsymLookup(tok.lex.szId);
psym->fAutoId = fTrue;
return psym;
}
/*-----------------------------------------------------------------------------
| FreeSymTable
|
| Free up all memory allocated for the symbol table
-------------------------------------------------------------WESC------------*/
VOID
FreeSymTable()
{
SYM *psym;
SYM *psymNext;
for (psym = psymFirst; psym != NULL; psym = psymNext)
{
psymNext = psym->psymNext;
free(psym->sz);
free(psym);
}
psymFirst = NULL;
}
/*-----------------------------------------------------------------------------
| PchFromRw
|
| Maps a reserved word into a string
-------------------------------------------------------------WESC------------*/
char *
PchFromRw(int rw,
BOOL fTrySecondName)
{
RWT *prwt;
prwt = rgrwt;
while (prwt->sz1 != NULL)
{
if (prwt->rw == rw)
{
if (fTrySecondName && prwt->sz2 != NULL)
return prwt->sz2;
return prwt->sz1;
}
prwt++;
}
return NULL;
}
/*-----------------------------------------------------------------------------
| RwFromLex
|
| Looks up lex.id in reserved word table. returns rwNil if not found
-------------------------------------------------------------WESC------------*/
RW
RwFromLex(LEX * plex)
{
RWT *prwt;
if (plex->lt != ltId)
return rwNil;
prwt = rgrwt;
while (prwt->sz1 != NULL)
{
if (FSzEqI(plex->szId, prwt->sz1)
|| (prwt->sz2 != NULL && FSzEqI(plex->szId, prwt->sz2)))
return prwt->rw;
prwt++;
}
return rwNil;
}
/*-----------------------------------------------------------------------------
| PteFromSz
|
| Look up a language tranlation entry. All strings in the .rcp file
| potentially get translated
-------------------------------------------------------------WESC------------*/
TE *
PteFromSz(char *sz)
{
TE *pte;
for (pte = pteFirst; pte != NULL; pte = pte->pteNext)
if (strcmp(pte->szOrig, sz) == 0)
return pte;
return NULL;
}
/*-----------------------------------------------------------------------------
| FreeTranslations
|
| Free up the translation table
-------------------------------------------------------------WESC------------*/
VOID
FreeTranslations()
{
TE *pte;
TE *pteNext;
for (pte = pteFirst; pte != NULL; pte = pteNext)
{
pteNext = pte->pteNext;
free(pte->szOrig);
free(pte->szTrans);
free(pte);
}
pteFirst = NULL;
}
/*-----------------------------------------------------------------------------
| NextLine
|
| Skip lexer ahead to the next line
-------------------------------------------------------------WESC------------*/
static BOOL
NextLine(void)
{
BOOL retval;
retval = fFalse;
szLine[0] = '\0'; /* just in case there is nothing to be gotten */
if (fgets(szLine, sizeof(szLine), vfhIn) != NULL)
{
iline++;
retval = fTrue;
}
FInitLexer(szLine, fTrue); /* so program can shut down gracefully */
return (retval);
}
/*-----------------------------------------------------------------------------
| FGetTok
|
| Get the next token. returns fFalse on EOF
|
| Consistency issue -- takes a ptok, but some other other routines don't.
| only one global tok...
-------------------------------------------------------------WESC------------*/
static BOOL
FGetTok(TOK * ptok)
{
BOOL fInComment;
if (fTokUngotten)
{
*ptok = tokPrev;
fTokUngotten = fFalse;
return fTrue;
}
ptok->rw = rwNil;
fInComment = fFalse;
for (;;)
{
while (!FGetLex(&ptok->lex, fInComment))
{
if (!NextLine())
{
if (fInComment)
ErrorLine("unexpected end of file during C-style comment");
return fFalse;
}
}
if (ptok->lex.lt == ltCComment)
fInComment = fTrue;
else if (ptok->lex.lt != ltEndCComment)
break;
else
fInComment = fFalse;
}
if (ptok->lex.lt == ltId)
{
/*
* check if it is a reserved word
*/
ptok->rw = RwFromLex(&ptok->lex);
}
else if (ptok->lex.lt == ltStr)
{
TE *pte;
/*
* attempt translation
*/
pte = PteFromSz(ptok->lex.szId);
if (pte != NULL)
strcpy(ptok->lex.szId, pte->szTrans);
}
tokPrev = *ptok;
return fTrue;
}
/*-----------------------------------------------------------------------------
| UngetTok
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -