rcp2c.c
来自「关于rcp2c_v3.rar协议在LINUX下的实现程序」· C语言 代码 · 共 2,332 行 · 第 1/5 页
C
2,332 行
|
| Pushback one token. Note! that this is 1 level only!
-------------------------------------------------------------WESC------------*/
VOID
UngetTok()
{
tok = tokPrev;
fTokUngotten = fTrue;
}
/*-----------------------------------------------------------------------------
| GetExpectLt
|
| Get a token and expect a particular lex type. Emit szErr if it isn't
| what's expected
-------------------------------------------------------------WESC------------*/
VOID
GetExpectLt(TOK * ptok,
LT lt,
char *szErr)
{
FGetTok(ptok);
if (ptok->lex.lt != lt)
{
if (szErr == NULL)
{
if (lt == ltId)
ErrorLine2("Syntax error : expecting identifier, got",
ptok->lex.szId);
else if (lt == ltStr)
ErrorLine2("Syntax error : expecting string, got", ptok->lex.szId);
else if (lt == ltConst)
ErrorLine2("Syntax error : expecting constant, got", ptok->lex.szId);
else
ErrorLine2("syntax error: ", ptok->lex.szId);
}
else
{
char szT[128];
sprintf(szT, "expecting: %s, got", szErr);
ErrorLine2(szT, ptok->lex.szId);
}
}
}
/*-----------------------------------------------------------------------------
| GetExpectRw
|
| Get and expect a particular reserved word. Emit "Expecting..." if next
| token isn't rw
-------------------------------------------------------------WESC------------*/
VOID
GetExpectRw(RW rw)
{
TOK tok;
FGetTok(&tok);
if (tok.rw != rw)
{
char szErr[64];
sprintf(szErr, "%s expected, got", PchFromRw(rw, fTrue));
ErrorLine2(szErr, tok.lex.szId);
}
}
/*-----------------------------------------------------------------------------
| PchGetSz
|
| Get a quoted string. return dup'ed string. (remember to free!)
-------------------------------------------------------------WESC------------*/
char *
PchGetSz(char *szErr)
{
GetExpectLt(&tok, ltStr, szErr);
return strdup(tok.lex.szId);
}
#ifdef DOESNTWORK
/*
* attempt at allowing GCC preprocessed string files
*/
/*-----------------------------------------------------------------------------
| PchGetSzMultiLine
|
| gets strings on multiple lines w/ \ continuation character.
-------------------------------------------------------------WESC------------*/
char *
PchGetSzMultiLine(char *szErr)
{
char sz[16384];
GetExpectLt(&tok, ltStr, szErr);
strcpy(sz, tok.lex.szId);
while (FGetTok(&tok))
{
if (tok.lex.lt == ltStr)
{
strcat(sz, tok.lex.szId);
}
else if (tok.lex.lt != ltBSlash)
{
UngetTok();
break;
}
else
{
GetExpectLt(&tok, ltStr, szErr);
strcat(sz, tok.lex.szId);
}
w return strdup(sz);
}
#else
/*-----------------------------------------------------------------------------
| PchGetSzMultiLine
|
| gets strings on multiple lines w/ \ continuation character.
-------------------------------------------------------------WESC------------*/
char *
PchGetSzMultiLine(char *szErr)
{
char sz[8192];
GetExpectLt(&tok, ltStr, szErr);
strcpy(sz, tok.lex.szId);
while (FGetTok(&tok))
{
if (tok.lex.lt != ltBSlash)
{
UngetTok();
break;
}
GetExpectLt(&tok, ltStr, szErr);
strcat(sz, tok.lex.szId);
}
return strdup(sz);
}
#endif
/*-----------------------------------------------------------------------------
| PchGetId
|
| Epect and get an ident. (ltId)
-------------------------------------------------------------WESC------------*/
char *
PchGetId(char *szErr)
{
GetExpectLt(&tok, ltId, szErr);
return strdup(tok.lex.szId);
}
/*-----------------------------------------------------------------------------
| WGetConst
|
| Get an integer constant or one of the Prev* reserved words, returning
| valu e.
|
-------------------------------------------------------------WESC------------*/
int
WGetConst(char *szErr,char * szIdName)
{
char sz[256];
if(szIdName)
szIdName[0]='\0';
if (!FGetTok(&tok))
ErrorLine("unexpected end of file");
switch (tok.rw)
{
default:
if (tok.lex.lt == ltId)
{
SYM *psym;
psym = PsymLookup(tok.lex.szId);
if (psym == NULL)
{
if (vfAutoId)
{
psym = PsymAddSymAutoId(tok.lex.szId);
}
else
{
sprintf(sz, "Expecting %s, got unknown symbol:", szErr);
ErrorLine2(sz, tok.lex.szId);
}
}
if(szIdName)
strcpy(szIdName,psym->sz);
return psym->wVal;
}
if (tok.lex.lt != ltConst)
{
sprintf(sz, "%s expected, got", szErr);
ErrorLine2(sz, tok.lex.szId);
}
if(szIdName)
{
strcpy(szIdName,"Obj_");
strcat(szIdName,tok.lex.szId);
}
return tok.lex.val;
case rwPrevLeft:
return rcPrev.topLeft.x;
case rwPrevRight:
return rcPrev.topLeft.x + rcPrev.extent.x;
case rwPrevWidth:
return rcPrev.extent.x;
case rwPrevTop:
return rcPrev.topLeft.y;
case rwPrevBottom:
return rcPrev.topLeft.y + rcPrev.extent.y;
case rwPrevHeight:
return rcPrev.extent.y;
}
}
int WGetConstEx(char *szErr,char * szIdName);
/*-----------------------------------------------------------------------------
| WGetConstExFactor
|
| Get a constant expression -- parens allowed left to right associativity
-------------------------------------------------------------WESC------------*/
int
WGetConstExFactor(char *szErr,char * szIdName)
{
int wVal;
if (FGetTok(&tok))
{
if (tok.lex.lt == ltLParen)
{
wVal = WGetConstEx(szErr,szIdName);
if (!FGetTok(&tok) || tok.lex.lt != ltRParen)
ErrorLine("Expected but didn't get ')'!");
}
else
{
UngetTok();
wVal = WGetConst(szErr,szIdName);
}
}
else
{
wVal = WGetConst(szErr,szIdName); /* aka hack */
}
return wVal;
}
/*-----------------------------------------------------------------------------
| WGetConstEx
|
| Get a constant expression -- parens allowed left to right associativity
-------------------------------------------------------------WESC------------*/
int
WGetConstEx(char *szErr,char * szIdName)
{
int wValT;
int wVal;
LT ltOp;
wVal = WGetConstExFactor(szErr,szIdName);
for (;;)
{
if (!FGetTok(&tok))
return wVal;
switch (tok.lex.lt)
{
default:
UngetTok();
return wVal;
case ltPlus:
case ltMinus:
case ltMult:
case ltDiv:
case ltPipe:
ltOp = tok.lex.lt;
wValT = WGetConstExFactor(szErr,NULL);
switch (ltOp)
{
case ltPlus:
wVal += wValT;
break;
case ltMinus:
wVal -= wValT;
break;
case ltMult:
wVal *= wValT;
break;
case ltDiv:
if (wValT == 0)
ErrorLine("Divide By Zero!");
wVal /= wValT;
break;
case ltPipe:
if (vfRTL)
wVal = wValT;
break;
}
}
}
return wVal;
}
/*-----------------------------------------------------------------------------
| Various Konstant types -- basically deferred evaluation of constants
| mainly for AUTO and CENTER because we can't evaluate them until we know
| the font for the particular item.
-------------------------------------------------------------WESC------------*/
/*
* Konstant Type
*/
typedef enum _kt
{
ktConst,
ktCenter,
ktAuto,
ktCenterAt,
ktRightAt,
ktBottomAt
}
KT;
/*
* Konstant
*/
typedef struct _k
{
KT kt;
int wVal;
}
K;
/*
* Konstant Point
*/
typedef struct _kpt
{
K kX;
K kY;
}
KPT;
/*
* Konstant Rect
*/
typedef struct _krc
{
KPT kptUpperLeft;
KPT kptExtent;
}
KRC;
/*-----------------------------------------------------------------------------
| KtGetK
|
| Get a Konstant, returning the type.
-------------------------------------------------------------WESC------------*/
KT
KtGetK(K * pk,
char *szErr)
{
if (!FGetTok(&tok))
ErrorLine("Unexpected end of file");
switch (tok.rw)
{
default:
UngetTok();
pk->kt = ktConst;
pk->wVal = WGetConstEx(szErr,NULL);
break;
case rwCenter:
pk->kt = ktCenter;
if (FGetTok(&tok))
{
if (tok.lex.lt == ltAt)
{
pk->wVal = WGetConstEx("CENTER@ position",NULL) * 2; /* we store extent */
pk->kt = ktCenterAt;
}
else
UngetTok();
}
break;
case rwAuto:
pk->kt = ktAuto;
break;
case rwRight:
pk->kt = ktRightAt;
GetExpectLt(&tok, ltAt, "@");
pk->wVal = WGetConstEx("RIGHT@ position",NULL);
break;
case rwBottom:
pk->kt = ktBottomAt;
GetExpectLt(&tok, ltAt, "@");
pk->wVal = WGetConstEx("BOTTOM@ position",NULL);
break;
}
return pk->kt;
}
/*-----------------------------------------------------------------------------
| ParseKpt
|
| Parse a point (not the AT and () parts).
-------------------------------------------------------------WESC------------*/
VOID
ParseKpt(KPT * pkpt)
{
KtGetK(&pkpt->kX, "x pos");
KtGetK(&pkpt->kY, "y pos");
}
/*-----------------------------------------------------------------------------
| ParseKrc
|
| Parse a rect (not the AT and () parts).
-------------------------------------------------------------WESC------------*/
VOID
ParseKrc(KRC * pkrc)
{
KtGetK(&pkrc->kptUpperLeft.kX, "rect left");
KtGetK(&pkrc->kptUpperLeft.kY, "rect top");
KtGetK(&pkrc->kptExtent.kX, "rect width");
KtGetK(&pkrc->kptExtent.kY, "rect height");
}
/*-----------------------------------------------------------------------------
| ITM
| an item in a form -- grif and grif2 define the syntax of the item
| and what to expect.
-------------------------------------------------------------WESC------------*/
typedef struct _itm
{
int grif;
int grifOut;
int grif2;
int grif2Out;
int grif3;
int grif3Out;
char *text;
int cbText; /* length of text including nul terminator */
int id;
char *szIdName;
int listid;
char *szListidName;
KRC krc;
/*
* RectangleType rc;
*/
RCRECT rc;
KPT kpt;
/*
* PointType pt;
*/
RCPOINT pt;
BOOL usable;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?