00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef __SC_H
00013 #define __SC_H
00014 #include <limits.h>
00015 #include <stdarg.h>
00016 #include <stdio.h>
00017 #if defined __BORLANDC__ && defined _Windows && !(defined __32BIT__ || defined __WIN32__)
00018
00019 #include <windows.h>
00020 typedef int jmp_buf[9];
00021 #define setjmp(b) Catch(b)
00022 #define longjmp(b,e) Throw(b,e)
00023 #else
00024 #include <setjmp.h>
00025 #endif
00026 #include "osdefs.h"
00027 #include "amx/amx.h"
00028
00029
00030
00031 #define PUBLIC_CHAR '@'
00032 #define CTRL_CHAR '^'
00033
00034 #if defined __MSDOS__ || defined __WIN32__ || defined _Windows
00035 #define DIRSEP_CHAR '\\'
00036 #elif defined macintosh
00037 #define DIRSEP_CHAR ':'
00038 #else
00039 #define DIRSEP_CHAR '/'
00040 #endif
00041
00042 #define sDIMEN_MAX 2
00043 #define sDEF_LITMAX 500
00044 #define sLINEMAX 511
00045 #define sNAMEMAX 31
00046 #define sDEF_AMXSTACK 4096
00047 #define sSTKMAX 80
00048 #define PREPROC_TERM '\x7f'
00049
00050 typedef void *stkitem;
00051
00052 typedef struct __s_arginfo {
00053 char name[sNAMEMAX+1];
00054 char ident;
00055 char usage;
00056 int *tags;
00057 int numtags;
00058 int dim[sDIMEN_MAX];
00059 int numdim;
00060 char hasdefault;
00061 union {
00062 cell val;
00063 char *symname;
00064 struct {
00065 cell *data;
00066 int size;
00067 int arraysize;
00068 cell addr;
00069 } array;
00070 } defvalue;
00071 } arginfo;
00072
00073
00074 typedef struct __s_constval {
00075 struct __s_constval *next;
00076 char name[sNAMEMAX+1];
00077 cell value;
00078 } constval;
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090 typedef struct __s_symbol {
00091 struct __s_symbol *next;
00092 struct __s_symbol *parent;
00093 char name[sNAMEMAX+1];
00094 uint32_t hash;
00095 cell addr;
00096 char vclass;
00097 char ident;
00098 char usage;
00099 int compound;
00100 int tag;
00101 union {
00102 int declared;
00103 int idxtag;
00104 constval *lib;
00105 } x;
00106 union {
00107 arginfo *arglist;
00108 struct {
00109 cell length;
00110 short level;
00111 } array;
00112 } dim;
00113 int fnumber;
00114 struct __s_symbol **refer;
00115 int numrefers;
00116 } symbol;
00117
00118
00119
00120
00121
00122
00123
00124 #define iLABEL 0
00125 #define iVARIABLE 1
00126 #define iREFERENCE 2
00127 #define iARRAY 3
00128 #define iREFARRAY 4
00129 #define iARRAYCELL 5
00130 #define iARRAYCHAR 6
00131 #define iEXPRESSION 7
00132 #define iCONSTEXPR 8
00133 #define iFUNCTN 9
00134 #define iREFFUNC 10
00135 #define iVARARGS 11
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165 #define uDEFINE 0x01
00166 #define uREAD 0x02
00167 #define uWRITTEN 0x04
00168 #define uRETVALUE 0x04
00169 #define uCONST 0x08
00170 #define uPROTOTYPED 0x08
00171 #define uPREDEF 0x08
00172 #define uPUBLIC 0x10
00173 #define uNATIVE 0x20
00174 #define uSTOCK 0x40
00175 #define uMISSING 0x80
00176
00177
00178
00179
00180 #define uRETNONE 0x10
00181 #define uSIZEOF 0x80
00182
00183 #define uMAINFUNC "main"
00184
00185 #define sGLOBAL 0
00186 #define sLOCAL 1
00187 #define sSTATIC 2
00188
00189 typedef struct {
00190 symbol *sym;
00191 cell constval;
00192
00193 int tag;
00194 char ident;
00195
00196 char boolresult;
00197 } value;
00198
00199
00200 typedef struct __s_alias {
00201 struct __s_alias *next;
00202 char name[sNAMEMAX+1];
00203 char alias[sEXPMAX+1];
00204 } namealias;
00205
00206
00207 enum {
00208 wqBRK,
00209 wqCONT,
00210 wqLOOP,
00211 wqEXIT,
00212
00213 wqSIZE
00214 };
00215 #define wqTABSZ (24*wqSIZE)
00216
00217 enum {
00218 statIDLE,
00219 statFIRST,
00220 statWRITE,
00221 statSKIP,
00222 };
00223
00224 typedef struct __s_stringlist {
00225 struct __s_stringlist *next;
00226 char *line;
00227 } stringlist;
00228
00229
00230 #define opcodes(n) ((n)*sizeof(cell))
00231 #define opargs(n) ((n)*sizeof(cell))
00232
00233
00234
00235
00236 #define tFIRST 256
00237 #define tMIDDLE 279
00238 #define tLAST 316
00239
00240 #define taMULT 256
00241 #define taDIV 257
00242 #define taMOD 258
00243 #define taADD 259
00244 #define taSUB 260
00245 #define taSHL 261
00246 #define taSHRU 262
00247 #define taSHR 263
00248 #define taAND 264
00249 #define taXOR 265
00250 #define taOR 266
00251 #define tlOR 267
00252 #define tlAND 268
00253 #define tlEQ 269
00254 #define tlNE 270
00255 #define tlLE 271
00256 #define tlGE 272
00257 #define tSHL 273
00258 #define tSHRU 274
00259 #define tSHR 275
00260 #define tINC 276
00261 #define tDEC 277
00262 #define tELLIPS 278
00263 #define tDBLDOT 279
00264
00265 #define tASSERT 280
00266 #define tBREAK 281
00267 #define tCASE 282
00268 #define tCHAR 283
00269 #define tCONST 284
00270 #define tCONTINUE 285
00271 #define tDEFAULT 286
00272 #define tDEFINED 287
00273 #define tDO 288
00274 #define tELSE 289
00275 #define tENUM 290
00276 #define tEXIT 291
00277 #define tFOR 292
00278 #define tFORWARD 293
00279 #define tGOTO 294
00280 #define tIF 295
00281 #define tNATIVE 296
00282 #define tNEW 297
00283 #define tOPERATOR 298
00284 #define tPUBLIC 299
00285 #define tRETURN 300
00286 #define tSIZEOF 301
00287 #define tSLEEP 302
00288 #define tSTATIC 303
00289 #define tSTOCK 304
00290 #define tSWITCH 305
00291 #define tWHILE 306
00292
00293 #define tpASSERT 307
00294 #define tpDEFINE 308
00295 #define tpELSE 309
00296 #define tpEMIT 310
00297 #define tpENDIF 311
00298 #define tpENDINPUT 312
00299 #define tpENDSCRPT 313
00300 #define tpIF 314
00301 #define tINCLUDE 315
00302 #define tpPRAGMA 316
00303
00304 #define tTERM 317
00305 #define tENDEXPR 318
00306
00307 #define tNUMBER 319
00308 #define tRATIONAL 320
00309 #define tSYMBOL 321
00310 #define tLABEL 322
00311 #define tSTRING 323
00312 #define tEXPR 324
00313
00314
00315 #define sSTARTREORDER 1
00316 #define sENDREORDER 2
00317 #define sEXPRSTART 0xc0
00318 #define sMAXARGS 64
00319
00320
00321 #define xEXIT 1
00322 #define xASSERTION 2
00323 #define xSTACKERROR 3
00324 #define xBOUNDSERROR 4
00325 #define xMEMACCESS 5
00326 #define xINVINSTR 6
00327 #define xSTACKUNDERFLOW 7
00328 #define xHEAPUNDERFLOW 8
00329 #define xCALLBACKERR 9
00330 #define xSLEEP 12
00331
00332
00333 #if !defined TRUE
00334 #define FALSE 0
00335 #define TRUE 1
00336 #endif
00337 #define sIN_CSEG 1
00338 #define sIN_DSEG 2
00339 #define sCHKBOUNDS 1
00340 #define sSYMBOLIC 2
00341 #define sNOOPTIMIZE 4
00342 #define sRESET 0
00343 #define sFORCESET 1
00344 #define sEXPRMARK 2
00345 #define sEXPRRELEASE 3
00346
00347 #if !defined _MAX_PATH
00348 #define _MAX_PATH 255
00349 #endif
00350 #if INT_MAX<0x8000u
00351 #define PUBLICTAG 0x8000u
00352 #define FIXEDTAG 0x4000u
00353 #else
00354 #define PUBLICTAG 0x80000000Lu
00355 #define FIXEDTAG 0x40000000Lu
00356 #endif
00357 #define TAGMASK (~PUBLICTAG)
00358
00359
00360
00361 #if defined __cplusplus
00362 extern "C" {
00363 #endif
00364
00365
00366
00367
00368 int sc_compile(int argc, char **argv);
00369 int sc_addconstant(char *name,cell value,int tag);
00370 int sc_addtag(char *name);
00371
00372
00373
00374
00375
00376
00377 int sc_printf(const char *message,...);
00378
00379
00380 int sc_error(int number,char *message,char *filename,int firstline,int lastline,va_list argptr);
00381
00382
00383 void *sc_opensrc(char *filename);
00384 void sc_closesrc(void *handle);
00385 void sc_resetsrc(void *handle,void *position);
00386 char *sc_readsrc(void *handle,char *target,int maxchars);
00387 void *sc_getpossrc(void *handle);
00388 int sc_eofsrc(void *handle);
00389
00390
00391 void *sc_openasm(char *filename);
00392 void sc_closeasm(void *handle,int deletefile);
00393 void sc_resetasm(void *handle);
00394 int sc_writeasm(void *handle,char *str);
00395 char *sc_readasm(void *handle,char *target,int maxchars);
00396
00397
00398 void *sc_openbin(char *filename);
00399 void sc_closebin(void *handle,int deletefile);
00400 void sc_resetbin(void *handle);
00401 int sc_writebin(void *handle,void *buffer,int size);
00402 long sc_lengthbin(void *handle);
00403
00404 #if defined __cplusplus
00405 }
00406 #endif
00407
00408
00409
00410
00411
00412 #if !defined SC_FUNC
00413 #define SC_FUNC
00414 #endif
00415 #if !defined SC_VDECL
00416 #define SC_VDECL extern
00417 #endif
00418 #if !defined SC_VDEFINE
00419 #define SC_VDEFINE
00420 #endif
00421
00422
00423 SC_FUNC symbol *fetchfunc(char *name,int tag);
00424 SC_FUNC char *funcdisplayname(char *dest,char *funcname);
00425 SC_FUNC int constexpr(cell *val,int *tag);
00426 SC_FUNC constval *append_constval(constval *table,char *name,cell val);
00427 SC_FUNC constval *find_constval(constval *table,char *name);
00428 SC_FUNC void delete_consttable(constval *table);
00429 SC_FUNC void add_constant(char *name,cell val,int vclass,int tag);
00430
00431
00432 SC_FUNC void pushstk(stkitem val);
00433 SC_FUNC stkitem popstk(void);
00434 SC_FUNC int plungefile(char *name);
00435 SC_FUNC void preprocess(void);
00436 SC_FUNC void lexinit(void);
00437 SC_FUNC int lex(cell *lexvalue,char **lexsym);
00438 SC_FUNC void lexpush(void);
00439 SC_FUNC void lexclr(void);
00440 SC_FUNC int matchtoken(int token);
00441 SC_FUNC int tokeninfo(cell *val,char **str);
00442 SC_FUNC int needtoken(int token);
00443 SC_FUNC void stowlit(cell value);
00444 SC_FUNC int alphanum(char c);
00445 SC_FUNC int ishex(char c);
00446 SC_FUNC void delete_symbol(symbol *root,symbol *sym);
00447 SC_FUNC void delete_symbols(symbol *root,int level,int del_labels,int delete_functions);
00448 SC_FUNC int refer_symbol(symbol *entry,symbol *bywhom);
00449 SC_FUNC void markusage(symbol *sym,int usage);
00450 SC_FUNC uint32_t namehash(char *name);
00451 SC_FUNC symbol *findglb(char *name);
00452 SC_FUNC symbol *findloc(char *name);
00453 SC_FUNC symbol *findconst(char *name);
00454 SC_FUNC symbol *finddepend(symbol *parent);
00455 SC_FUNC symbol *addsym(char *name,cell addr,int ident,int vclass,int tag,
00456 int usage);
00457 SC_FUNC symbol *addvariable(char *name,cell addr,int ident,int vclass,int tag,
00458 int dim[],int numdim,int idxtag[]);
00459 SC_FUNC int getlabel(void);
00460 SC_FUNC char *itoh(ucell val);
00461
00462
00463 SC_FUNC int check_userop(void (*oper)(void),int tag1,int tag2,int numparam,
00464 value *lval,int *resulttag);
00465 SC_FUNC int matchtag(int formaltag,int actualtag,int allowcoerce);
00466 SC_FUNC int expression(int *constant,cell *val,int *tag,int chkfuncresult);
00467 SC_FUNC int hier14(value *lval1);
00468
00469
00470 SC_FUNC void writeleader(void);
00471 SC_FUNC void writetrailer(void);
00472 SC_FUNC void begcseg(void);
00473 SC_FUNC void begdseg(void);
00474 SC_FUNC void setactivefile(int fnumber);
00475 SC_FUNC cell nameincells(char *name);
00476 SC_FUNC void setfile(char *name,int fileno);
00477 SC_FUNC void setline(int line,int fileno);
00478 SC_FUNC void setlabel(int index);
00479 SC_FUNC void endexpr(void);
00480 SC_FUNC void startfunc(char *fname);
00481 SC_FUNC void endfunc(void);
00482 SC_FUNC void alignframe(int numbytes);
00483 SC_FUNC void defsymbol(char *name,int ident,int vclass,cell offset);
00484 SC_FUNC void symbolrange(int level,cell size);
00485 SC_FUNC void rvalue(value *lval);
00486 SC_FUNC void address(symbol *ptr);
00487 SC_FUNC void store(value *lval);
00488 SC_FUNC void memcopy(cell size);
00489 SC_FUNC void copyarray(symbol *sym,cell size);
00490 SC_FUNC void fillarray(symbol *sym,cell size,cell value);
00491 SC_FUNC void const1(cell val);
00492 SC_FUNC void const2(cell val);
00493 SC_FUNC void moveto1(void);
00494 SC_FUNC void push1(void);
00495 SC_FUNC void push2(void);
00496 SC_FUNC void pushval(cell val);
00497 SC_FUNC void pop1(void);
00498 SC_FUNC void pop2(void);
00499 SC_FUNC void swap1(void);
00500 SC_FUNC void ffswitch(int label);
00501 SC_FUNC void ffcase(cell value,char *labelname,int newtable);
00502 SC_FUNC void ffcall(symbol *sym,int numargs);
00503 SC_FUNC void ffret(void);
00504 SC_FUNC void ffabort(int reason);
00505 SC_FUNC void ffbounds(cell size);
00506 SC_FUNC void jumplabel(int number);
00507 SC_FUNC void defstorage(void);
00508 SC_FUNC void modstk(int delta);
00509 SC_FUNC void setstk(cell value);
00510 SC_FUNC void modheap(int delta);
00511 SC_FUNC void setheap_pri(void);
00512 SC_FUNC void setheap(cell value);
00513 SC_FUNC void cell2addr(void);
00514 SC_FUNC void cell2addr_alt(void);
00515 SC_FUNC void addr2cell(void);
00516 SC_FUNC void char2addr(void);
00517 SC_FUNC void charalign(void);
00518 SC_FUNC void addconst(cell value);
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528 SC_FUNC void os_mult(void);
00529 SC_FUNC void os_div(void);
00530 SC_FUNC void os_mod(void);
00531 SC_FUNC void ob_add(void);
00532 SC_FUNC void ob_sub(void);
00533 SC_FUNC void ob_sal(void);
00534 SC_FUNC void os_sar(void);
00535 SC_FUNC void ou_sar(void);
00536 SC_FUNC void ob_or(void);
00537 SC_FUNC void ob_xor(void);
00538 SC_FUNC void ob_and(void);
00539 SC_FUNC void ob_eq(void);
00540 SC_FUNC void ob_ne(void);
00541 SC_FUNC void relop_prefix(void);
00542 SC_FUNC void relop_suffix(void);
00543 SC_FUNC void os_le(void);
00544 SC_FUNC void os_ge(void);
00545 SC_FUNC void os_lt(void);
00546 SC_FUNC void os_gt(void);
00547
00548 SC_FUNC void lneg(void);
00549 SC_FUNC void neg(void);
00550 SC_FUNC void invert(void);
00551 SC_FUNC void nooperation(void);
00552 SC_FUNC void inc(value *lval);
00553 SC_FUNC void dec(value *lval);
00554 SC_FUNC void jmp_ne0(int number);
00555 SC_FUNC void jmp_eq0(int number);
00556 SC_FUNC void outval(cell val,int newline);
00557
00558
00559 SC_FUNC int error(int number,...);
00560 SC_FUNC void errorset(int code);
00561
00562
00563 SC_FUNC void assemble(FILE *fout,FILE *fin);
00564
00565
00566 SC_FUNC void stgbuffer_cleanup(void);
00567 SC_FUNC void stgmark(char mark);
00568 SC_FUNC void stgwrite(char *st);
00569 SC_FUNC void stgout(int index);
00570 SC_FUNC void stgdel(int index,cell code_index);
00571 SC_FUNC int stgget(int *index,cell *code_index);
00572 SC_FUNC void stgset(int onoff);
00573 SC_FUNC int phopt_init(void);
00574 SC_FUNC int phopt_cleanup(void);
00575
00576
00577 SC_FUNC namealias *insert_alias(char *name,char *alias);
00578 SC_FUNC namealias *find_alias(char *name);
00579 SC_FUNC int lookup_alias(char *target,char *name);
00580 SC_FUNC void delete_aliastable(void);
00581 SC_FUNC stringlist *insert_path(char *path);
00582 SC_FUNC char *get_path(int index);
00583 SC_FUNC void delete_pathtable(void);
00584
00585
00586 #if !defined SC_SKIP_VDECL
00587 SC_VDECL symbol loctab;
00588 SC_VDECL symbol glbtab;
00589 SC_VDECL cell *litq;
00590 SC_VDECL char pline[];
00591 SC_VDECL char *lptr;
00592 SC_VDECL constval tagname_tab;
00593 SC_VDECL constval libname_tab;
00594 SC_VDECL constval *curlibrary;
00595 SC_VDECL symbol *curfunc;
00596 SC_VDECL char *inpfname;
00597 SC_VDECL char outfname[];
00598 SC_VDECL char errfname[];
00599 SC_VDECL char sc_ctrlchar;
00600 SC_VDECL int litidx;
00601 SC_VDECL int litmax;
00602 SC_VDECL int stgidx;
00603 SC_VDECL int labnum;
00604 SC_VDECL int staging;
00605 SC_VDECL cell declared;
00606 SC_VDECL cell glb_declared;
00607 SC_VDECL cell code_idx;
00608 SC_VDECL int ntv_funcid;
00609 SC_VDECL int errnum;
00610 SC_VDECL int warnnum;
00611 SC_VDECL int sc_debug;
00612 SC_VDECL int charbits;
00613 SC_VDECL int sc_packstr;
00614 SC_VDECL int sc_listing;
00615 SC_VDECL int sc_compress;
00616 SC_VDECL int sc_needsemicolon;
00617 SC_VDECL int sc_dataalign;
00618 SC_VDECL int sc_alignnext;
00619 SC_VDECL int makereport;
00620 SC_VDECL int curseg;
00621 SC_VDECL cell sc_stksize;
00622 SC_VDECL int freading;
00623 SC_VDECL int fline;
00624 SC_VDECL int fnumber;
00625 SC_VDECL int fcurrent;
00626 SC_VDECL int intest;
00627 SC_VDECL int sideeffect;
00628 SC_VDECL int stmtindent;
00629 SC_VDECL int indent_nowarn;
00630 SC_VDECL int sc_tabsize;
00631 SC_VDECL int sc_allowtags;
00632 SC_VDECL int sc_status;
00633 SC_VDECL int sc_rationaltag;
00634 SC_VDECL int rational_digits;
00635
00636 SC_VDECL FILE *inpf;
00637 SC_VDECL FILE *inpf_org;
00638 SC_VDECL FILE *outf;
00639
00640 SC_VDECL jmp_buf errbuf;
00641 #endif
00642
00643 #endif