home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / misc / volume40 / bwbasic / part03 < prev    next >
Encoding:
Text File  |  1993-10-29  |  70.4 KB  |  1,791 lines

  1. Newsgroups: comp.sources.misc
  2. From: tcamp@delphi.com (Ted A. Campbell)
  3. Subject: v40i054:  bwbasic - Bywater BASIC interpreter version 2.10, Part03/15
  4. Message-ID: <1993Oct29.162437.3443@sparky.sterling.com>
  5. X-Md4-Signature: d1bcca0825281c0c3b34264de43b9dab
  6. Sender: kent@sparky.sterling.com (Kent Landfield)
  7. Organization: Sterling Software
  8. Date: Fri, 29 Oct 1993 16:24:37 GMT
  9. Approved: kent@sparky.sterling.com
  10.  
  11. Submitted-by: tcamp@delphi.com (Ted A. Campbell)
  12. Posting-number: Volume 40, Issue 54
  13. Archive-name: bwbasic/part03
  14. Environment: UNIX, DOS
  15. Supersedes: bwbasic: Volume 33, Issue 37-47
  16.  
  17. #! /bin/sh
  18. # This is a shell archive.  Remove anything before this line, then feed it
  19. # into a shell via "sh file" or similar.  To overwrite existing files,
  20. # type "sh file -c".
  21. # Contents:  bwbasic-2.10/bwb_tbl.c bwbasic-2.10/bwbasic.h
  22. # Wrapped by kent@sparky on Thu Oct 21 10:47:48 1993
  23. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
  24. echo If this archive is complete, you will see the following message:
  25. echo '          "shar: End of archive 3 (of 15)."'
  26. if test -f 'bwbasic-2.10/bwb_tbl.c' -a "${1}" != "-c" ; then 
  27.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwb_tbl.c'\"
  28. else
  29.   echo shar: Extracting \"'bwbasic-2.10/bwb_tbl.c'\" \(13470 characters\)
  30.   sed "s/^X//" >'bwbasic-2.10/bwb_tbl.c' <<'END_OF_FILE'
  31. X/***************************************************************
  32. X
  33. X    bwb_tbl.c       Command, Function, Operator, 
  34. X            and Error-Message Tables
  35. X                        for Bywater BASIC Interpreter
  36. X
  37. X                        Copyright (c) 1993, Ted A. Campbell
  38. X                        Bywater Software
  39. X
  40. X                        email: tcamp@delphi.com
  41. X
  42. X        Copyright and Permissions Information:
  43. X
  44. X        All U.S. and international rights are claimed by the author,
  45. X        Ted A. Campbell.
  46. X
  47. X    This software is released under the terms of the GNU General
  48. X    Public License (GPL), which is distributed with this software
  49. X    in the file "COPYING".  The GPL specifies the terms under
  50. X    which users may copy and use the software in this distribution.
  51. X
  52. X    A separate license is available for commercial distribution,
  53. X    for information on which you should contact the author.
  54. X
  55. X***************************************************************/
  56. X
  57. X#include <stdio.h>
  58. X
  59. X#include "bwbasic.h"
  60. X#include "bwb_mes.h"
  61. X
  62. Xint err_line = 0;            /* line in which error occurred */
  63. Xint err_number = 0;            /* number of last error */
  64. X
  65. X/***************************************************************
  66. X
  67. X        Command Table for Bywater BASIC
  68. X
  69. X***************************************************************/
  70. X
  71. Xstruct bwb_command bwb_cmdtable[ COMMANDS ] =
  72. X   {
  73. X
  74. X#if PERMANENT_DEBUG
  75. X      { CMD_VARS,         bwb_vars },
  76. X      { CMD_CMDS,         bwb_cmds },
  77. X      { CMD_FNCS,         bwb_fncs },
  78. X#endif
  79. X
  80. X#if UNIX_CMDS
  81. X      { CMD_CHDIR,        bwb_chdir },
  82. X      { CMD_MKDIR,        bwb_mkdir },
  83. X      { CMD_RMDIR,        bwb_rmdir },
  84. X      { CMD_KILL,         bwb_kill },
  85. X      { CMD_ENVIRON,      bwb_environ },
  86. X#endif
  87. X
  88. X#if INTERACTIVE
  89. X      { CMD_LIST,         bwb_list },
  90. X      { CMD_LOAD,         bwb_load },
  91. X      { CMD_RUN,          bwb_run },
  92. X      { CMD_SAVE,         bwb_save },
  93. X      { CMD_DELETE,       bwb_delete },
  94. X      { CMD_NEW,          bwb_new },
  95. X      { CMD_QUIT,         bwb_system },
  96. X      { CMD_SYSTEM,       bwb_system },
  97. X#endif
  98. X
  99. X#if MS_CMDS
  100. X      { CMD_DEFDBL,       bwb_ddbl },
  101. X      { CMD_DEFINT,       bwb_dint },
  102. X      { CMD_DEFSNG,       bwb_dsng },
  103. X      { CMD_DEFSTR,       bwb_dstr },
  104. X#if IMP_CMDCLS
  105. X      { CMD_CLS,          bwb_cls },
  106. X#endif
  107. X#if IMP_CMDCOLOR
  108. X      { CMD_COLOR,        bwb_color },
  109. X#endif
  110. X#if IMP_CMDLOC
  111. X      { CMD_LOCATE,       bwb_locate },
  112. X#endif
  113. X#endif
  114. X
  115. X#if STRUCT_CMDS
  116. X      { CMD_CALL,         bwb_call },
  117. X      { CMD_SUB,          bwb_sub },
  118. X      { CMD_FUNCTION,     bwb_function },
  119. X      { CMD_LABEL,        bwb_null },
  120. X      { CMD_ELSE,         bwb_else },
  121. X      { CMD_ELSEIF,       bwb_elseif },
  122. X      { CMD_SELECT,       bwb_select },
  123. X      { CMD_CASE,         bwb_case },
  124. X      { CMD_LOOP,         bwb_loop },
  125. X      { CMD_EXIT,         bwb_exit },
  126. X#endif
  127. X
  128. X#if COMMON_CMDS
  129. X      { CMD_MERGE,        bwb_merge },
  130. X      { CMD_CHAIN,        bwb_chain },
  131. X      { CMD_COMMON,       bwb_common },
  132. X      { CMD_ERROR,        bwb_lerror },
  133. X      { CMD_WIDTH,        bwb_width },
  134. X      { CMD_TRON,         bwb_tron },
  135. X      { CMD_TROFF,        bwb_troff },
  136. X      { CMD_FILES,        bwb_files },
  137. X      { CMD_EDIT,         bwb_edit },
  138. X      { CMD_ERASE,        bwb_erase },
  139. X      { CMD_SWAP,         bwb_swap },
  140. X      { CMD_NAME,         bwb_name },
  141. X      { CMD_CLEAR,        bwb_clear },
  142. X      { CMD_WHILE,        bwb_while },
  143. X      { CMD_WEND,         bwb_wend },
  144. X      { CMD_WRITE,        bwb_write },
  145. X      { CMD_OPEN,         bwb_open },
  146. X      { CMD_CLOSE,        bwb_close },
  147. X      { CMD_GET,          bwb_get },
  148. X      { CMD_PUT,          bwb_put },
  149. X      { CMD_LSET,         bwb_lset },
  150. X      { CMD_RSET,         bwb_rset },
  151. X      { CMD_FIELD,        bwb_field },
  152. X      { CMD_LINE,         bwb_line },
  153. X#endif
  154. X
  155. X      /* The remainder are the core functions defined for ANSI Minimal BASIC */
  156. X
  157. X      { CMD_DATA,         bwb_data },
  158. X      { CMD_DEF,          bwb_def },
  159. X      { CMD_DIM,          bwb_dim },
  160. X      { CMD_END,          bwb_xend },
  161. X      { CMD_FOR,          bwb_for },
  162. X      { CMD_DO,           bwb_do },  /* not really core but needed in two different places */
  163. X      { CMD_GO,          bwb_go },
  164. X      { CMD_GOSUB,        bwb_gosub },
  165. X      { CMD_GOTO,         bwb_goto },
  166. X      { CMD_IF,           bwb_if },
  167. X      { CMD_INPUT,        bwb_input },
  168. X      { CMD_LET,          bwb_let },
  169. X      { CMD_NEXT,         bwb_next },
  170. X      { CMD_ON,           bwb_on },
  171. X      { CMD_OPTION,       bwb_option },
  172. X      { CMD_PRINT,        bwb_print },
  173. X      { CMD_RANDOMIZE,    bwb_randomize },
  174. X      { CMD_READ,         bwb_read },
  175. X      { CMD_REM,          bwb_rem },
  176. X      { CMD_RESTORE,      bwb_restore },
  177. X      { CMD_RETURN,       bwb_return },
  178. X      { CMD_STOP,         bwb_stop }
  179. X   };
  180. X
  181. X/***************************************************************
  182. X
  183. X        Predefined Function Table for Bywater BASIC
  184. X
  185. X***************************************************************/
  186. X
  187. Xstruct bwb_function bwb_prefuncs[ FUNCTIONS ] =
  188. X   {
  189. X
  190. X#if INTENSIVE_DEBUG
  191. X   { "TEST",    NUMBER,         2,   fnc_test,       (struct bwb_function *) NULL, 0    },
  192. X#endif
  193. X
  194. X#if MS_FUNCS            /* Functions unique to Microsoft GWBASIC (tm) */
  195. X   { "ASC",     NUMBER,         1,   fnc_asc,        (struct bwb_function *) NULL, 0    },
  196. X   { "MKD$",    STRING,         1,   fnc_mkd,        (struct bwb_function *) NULL, 0    },
  197. X   { "MKI$",    STRING,         1,   fnc_mki,        (struct bwb_function *) NULL, 0    },
  198. X   { "MKS$",    STRING,         1,   fnc_mks,        (struct bwb_function *) NULL, 0    },
  199. X   { "CVD",     NUMBER,         1,   fnc_cvd,        (struct bwb_function *) NULL, 0    },
  200. X   { "CVS",     NUMBER,         1,   fnc_cvs,        (struct bwb_function *) NULL, 0    },
  201. X   { "CVI",     NUMBER,         1,   fnc_cvi,        (struct bwb_function *) NULL, 0    },
  202. X   { "CINT",    NUMBER,         1,   fnc_cint,       (struct bwb_function *) NULL, 0    },
  203. X   { "CSNG",    NUMBER,         1,   fnc_csng,       (struct bwb_function *) NULL, 0    },
  204. X   { "ENVIRON$",STRING,         1,   fnc_environ,    (struct bwb_function *) NULL, 0    },
  205. X   { "ERR",     NUMBER,         0,   fnc_err,        (struct bwb_function *) NULL, 0    },
  206. X   { "ERL",     NUMBER,         0,   fnc_erl,        (struct bwb_function *) NULL, 0    },
  207. X   { "LOC",     NUMBER,         1,   fnc_loc,        (struct bwb_function *) NULL, 0    },
  208. X   { "LOF",     NUMBER,         1,   fnc_lof,        (struct bwb_function *) NULL, 0    },
  209. X   { "EOF",     NUMBER,         1,   fnc_eof,        (struct bwb_function *) NULL, 0    },
  210. X   { "INSTR",   NUMBER,         1,   fnc_instr,      (struct bwb_function *) NULL, 0    },
  211. X   { "SPC",     STRING,        1,   fnc_spc,        (struct bwb_function *) NULL, 0    },
  212. X   { "SPACE$",  STRING,        1,   fnc_space,      (struct bwb_function *) NULL, 0    },
  213. X   { "STRING$", STRING,        1,   fnc_string,     (struct bwb_function *) NULL, 0    },
  214. X   { "MID$",    STRING,        3,   fnc_mid,        (struct bwb_function *) NULL, 0    },
  215. X   { "LEFT$",   STRING,        2,   fnc_left,       (struct bwb_function *) NULL, 0    },
  216. X   { "RIGHT$",  STRING,        2,   fnc_right,      (struct bwb_function *) NULL, 0    },
  217. X   { "TIMER",   NUMBER,         0,   fnc_timer,      (struct bwb_function *) NULL, 0    },
  218. X   { "HEX$",    STRING,         1,   fnc_hex,        (struct bwb_function *) NULL, 0    },
  219. X   { "OCT$",    STRING,         1,   fnc_oct,        (struct bwb_function *) NULL, 0    },
  220. X#if IMP_FNCINKEY == 1
  221. X   { "INKEY$",  STRING,         1,   fnc_inkey,      (struct bwb_function *) NULL, 0    },
  222. X#endif
  223. X#endif
  224. X
  225. X#if COMMON_FUNCS            /* Functions common to GWBASIC and ANSI Full BASIC */
  226. X   { "CHR$",    NUMBER,         0,   fnc_chr,        (struct bwb_function *) NULL, 0    },
  227. X   { "LEN",     NUMBER,         1,   fnc_len,        (struct bwb_function *) NULL, 0    },
  228. X   { "POS",     NUMBER,         0,   fnc_pos,        (struct bwb_function *) NULL, 0    },
  229. X   { "VAL",     NUMBER,         1,   fnc_val,        (struct bwb_function *) NULL, 0    },
  230. X   { "STR$",    STRING,         1,   fnc_str,        (struct bwb_function *) NULL, 0    },
  231. X   { "DATE$",   STRING,         0,   fnc_date,       (struct bwb_function *) NULL, 0    },
  232. X   { "TIME$",   STRING,         0,   fnc_time,       (struct bwb_function *) NULL, 0    },
  233. X#endif
  234. X
  235. X#if ANSI_FUNCS            /* Functions required for ANSI Full BASIC */
  236. X#endif
  237. X
  238. X   /* The remainder are core functions defined for ANSI Minimal BASIC */
  239. X
  240. X#if COMPRESS_FUNCS
  241. X   { "ABS",     NUMBER,         1,   fnc_core,        (struct bwb_function *) NULL, F_ABS    },
  242. X   { "ATN",     NUMBER,         1,   fnc_core,        (struct bwb_function *) NULL, F_ATN    },
  243. X   { "COS",     NUMBER,         1,   fnc_core,        (struct bwb_function *) NULL, F_COS    },
  244. X   { "EXP",     NUMBER,         1,   fnc_core,        (struct bwb_function *) NULL, F_EXP    },
  245. X   { "INT",     NUMBER,         1,   fnc_core,        (struct bwb_function *) NULL, F_INT    },
  246. X   { "LOG",     NUMBER,         1,   fnc_core,        (struct bwb_function *) NULL, F_LOG    },
  247. X   { "RND",     NUMBER,         0,   fnc_core,        (struct bwb_function *) NULL, F_RND    },
  248. X   { "SGN",     NUMBER,         1,   fnc_core,        (struct bwb_function *) NULL, F_SGN    },
  249. X   { "SIN",     NUMBER,         1,   fnc_core,        (struct bwb_function *) NULL, F_SIN    },
  250. X   { "SQR",     NUMBER,         1,   fnc_core,        (struct bwb_function *) NULL, F_SQR    },
  251. X   { "TAN",     NUMBER,         1,   fnc_core,        (struct bwb_function *) NULL, F_TAN    },
  252. X#else
  253. X   { "ABS",     NUMBER,         1,   fnc_abs,        (struct bwb_function *) NULL, 0    },
  254. X   { "ATN",     NUMBER,         1,   fnc_atn,        (struct bwb_function *) NULL, 0    },
  255. X   { "COS",     NUMBER,         1,   fnc_cos,        (struct bwb_function *) NULL, 0    },
  256. X   { "EXP",     NUMBER,         1,   fnc_exp,        (struct bwb_function *) NULL, 0    },
  257. X   { "INT",     NUMBER,         1,   fnc_int,        (struct bwb_function *) NULL, 0    },
  258. X   { "LOG",     NUMBER,         1,   fnc_log,        (struct bwb_function *) NULL, 0    },
  259. X   { "RND",     NUMBER,         0,   fnc_rnd,        (struct bwb_function *) NULL, 0    },
  260. X   { "SGN",     NUMBER,         1,   fnc_sgn,        (struct bwb_function *) NULL, 0    },
  261. X   { "SIN",     NUMBER,         1,   fnc_sin,        (struct bwb_function *) NULL, 0    },
  262. X   { "SQR",     NUMBER,         1,   fnc_sqr,        (struct bwb_function *) NULL, 0    },
  263. X   { "TAN",     NUMBER,         1,   fnc_tan,        (struct bwb_function *) NULL, 0    },
  264. X#endif
  265. X   { "TAB",     STRING,         1,   fnc_tab,        (struct bwb_function *) NULL, 0    }
  266. X   };
  267. X
  268. X/***************************************************************
  269. X
  270. X    Operator Table for Bywater BASIC
  271. X
  272. X***************************************************************/
  273. X
  274. Xstruct bwb_op exp_ops[ N_OPERATORS ] =
  275. X   {
  276. X   { "NOT",     OP_NOT,         12 },   /* multiple-character operators */
  277. X   { "AND",     OP_AND,         13 },   /* should be tested first because */
  278. X   { "OR",      OP_OR,          14 },   /* e.g. a ">=" would be matched */
  279. X   { "XOR",     OP_XOR,         15 },   /* as "=" if the single-character */
  280. X   { "IMP",     OP_IMPLIES,     16 },   /* operator came first */
  281. X   { "EQV",     OP_EQUIV,       17 },
  282. X   { "MOD",     OP_MODULUS,     4  },
  283. X   { "<>",      OP_NOTEQUAL,    7  },
  284. X   { "<=",      OP_LTEQ,        10 },
  285. X   { "=<",      OP_LTEQ,        10 },   /* allow either form */
  286. X   { ">=",      OP_GTEQ,        11 },
  287. X   { "=>",      OP_GTEQ,        11 },   /* allow either form */
  288. X   { "<",       OP_LESSTHAN,    8  },
  289. X   { ">",       OP_GREATERTHAN, 9  },
  290. X   { "^",       OP_EXPONENT,    0  },
  291. X   { "*",       OP_MULTIPLY,    2  },
  292. X   { "/",       OP_DIVIDE,      2  },
  293. X   { "\\",      OP_INTDIVISION, 3  },
  294. X   { "+",       OP_ADD,         5  },
  295. X   { "-",       OP_SUBTRACT,    5  },
  296. X   { "=",       OP_EQUALS,      6  },
  297. X   { "=",       OP_ASSIGN,      6  },   /* don't worry: OP_EQUALS will be converted to OP_ASSIGN if necessary */
  298. X   { ";",       OP_STRJOIN,     18 },
  299. X   { ",",       OP_STRTAB,      19 }
  300. X   };
  301. X
  302. X/* Error messages used more than once */
  303. X
  304. Xchar err_openfile[] =   ERR_OPENFILE;
  305. Xchar err_getmem[] =     ERR_GETMEM;
  306. Xchar err_noln[] =       ERR_NOLN;
  307. Xchar err_nofn[] =       ERR_NOFN;
  308. Xchar err_lnnotfound[] = ERR_LNNOTFOUND;
  309. Xchar err_incomplete[] = ERR_INCOMPLETE;
  310. Xchar err_valoorange[] = ERR_VALOORANGE;
  311. Xchar err_syntax[] =     ERR_SYNTAX;
  312. Xchar err_devnum[] =     ERR_DEVNUM;
  313. Xchar err_dev[] =        ERR_DEV;
  314. Xchar err_opsys[] =    ERR_OPSYS;
  315. Xchar err_argstr[] =     ERR_ARGSTR;
  316. Xchar err_defchar[] =     ERR_DEFCHAR;
  317. Xchar err_mismatch[] =    ERR_MISMATCH;
  318. Xchar err_dimnotarray[] =ERR_DIMNOTARRAY;
  319. Xchar err_retnogosub[] = ERR_RETNOGOSUB;
  320. Xchar err_od[] =         ERR_OD;
  321. Xchar err_overflow[] =   ERR_OVERFLOW;
  322. Xchar err_nf[] =         ERR_NF;
  323. Xchar err_uf[] =         ERR_UF;
  324. Xchar err_dbz[] =        ERR_DBZ;
  325. Xchar err_redim[] =      ERR_REDIM;
  326. Xchar err_obdim[] =      ERR_OBDIM;
  327. Xchar err_uc[] =     ERR_UC;
  328. Xchar err_noprogfile[] = ERR_NOPROGFILE;
  329. X
  330. X/***************************************************************
  331. X
  332. X    Error Message Table for Bywater BASIC
  333. X
  334. X***************************************************************/
  335. X
  336. Xchar *err_table[ N_ERRORS ] =
  337. X   {
  338. X   err_openfile,
  339. X   err_getmem,
  340. X   err_noln,
  341. X   err_nofn,
  342. X   err_lnnotfound,
  343. X   err_incomplete,
  344. X   err_valoorange,
  345. X   err_syntax,
  346. X   err_devnum,
  347. X   err_dev,
  348. X   err_opsys,
  349. X   err_argstr,
  350. X   err_defchar,
  351. X   err_mismatch,
  352. X   err_dimnotarray,
  353. X   err_od,
  354. X   err_overflow,
  355. X   err_nf,
  356. X   err_uf,
  357. X   err_dbz,
  358. X   err_redim,
  359. X   err_obdim,
  360. X   err_uc,
  361. X   err_noprogfile
  362. X   };
  363. X
  364. X
  365. END_OF_FILE
  366.   if test 13470 -ne `wc -c <'bwbasic-2.10/bwb_tbl.c'`; then
  367.     echo shar: \"'bwbasic-2.10/bwb_tbl.c'\" unpacked with wrong size!
  368.   fi
  369.   # end of 'bwbasic-2.10/bwb_tbl.c'
  370. fi
  371. if test -f 'bwbasic-2.10/bwbasic.h' -a "${1}" != "-c" ; then 
  372.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbasic.h'\"
  373. else
  374.   echo shar: Extracting \"'bwbasic-2.10/bwbasic.h'\" \(54437 characters\)
  375.   sed "s/^X//" >'bwbasic-2.10/bwbasic.h' <<'END_OF_FILE'
  376. X/***************************************************************
  377. X
  378. X        bwbasic.h       Header File
  379. X                        for Bywater BASIC Interpreter
  380. X
  381. X                        Copyright (c) 1993, Ted A. Campbell
  382. X                        Bywater Software
  383. X
  384. X                        email: tcamp@delphi.com
  385. X
  386. X        Copyright and Permissions Information:
  387. X
  388. X        All U.S. and international rights are claimed by the author,
  389. X        Ted A. Campbell.
  390. X
  391. X    This software is released under the terms of the GNU General
  392. X    Public License (GPL), which is distributed with this software
  393. X    in the file "COPYING".  The GPL specifies the terms under
  394. X    which users may copy and use the software in this distribution.
  395. X
  396. X    A separate license is available for commercial distribution,
  397. X    for information on which you should contact the author.
  398. X
  399. X***************************************************************/
  400. X
  401. X
  402. X#ifndef TRUE
  403. X#define TRUE    -1
  404. X#define FALSE   0
  405. X#endif
  406. X
  407. X/***************************************************************
  408. X
  409. X    bwbasic.h    Part I: Definitions
  410. X
  411. X***************************************************************/
  412. X
  413. X/* Version number */
  414. X
  415. X#define VERSION         "2.10"          /* Current version number */
  416. X
  417. X/***************************************************************
  418. X
  419. X    bwbasic.h:    Part I-A: Define Major Hardware Implementation
  420. X
  421. X            Gone is the simplicity of earlier versions.
  422. X            You must specify one and only one of the
  423. X            following hardware implementations as TRUE.
  424. X            IMP_TTY is the default implementation.
  425. X            It is the most minimal, but the most
  426. X            universal hardware implementation.
  427. X
  428. X***************************************************************/
  429. X
  430. X#define IMP_TTY         TRUE     /* simple TTY-style interface using stdio */
  431. X#define IMP_IQC         FALSE    /* IBM PC, Microsoft QuickC Compiler */
  432. X
  433. X#if IMP_TTY
  434. X#include "bwx_tty.h"
  435. X#endif
  436. X
  437. X#if IMP_IQC
  438. X#include "bwx_iqc.h"
  439. X#endif
  440. X
  441. X/***************************************************************
  442. X
  443. X    bwbasic.h:    Part I-B: Define Compiler Implementation
  444. X
  445. X            You also need to give some information about
  446. X            your C compiler.  If your compiler is ANSI-
  447. X            compatible, don't worry about these.  But
  448. X            if your compiler is "stock," you might
  449. X            want to indicate which of the following
  450. X            sets of features it has or dosn't have.
  451. X
  452. X***************************************************************/
  453. X
  454. X#ifdef MSDOS
  455. X#define HAVE_RAISE TRUE
  456. X#define HAVE_STRING TRUE
  457. X#define HAVE_STDLIB TRUE
  458. X#endif
  459. X
  460. X#ifdef __STDC__
  461. X#define    HAVE_SIGNAL    TRUE
  462. X#else
  463. X#define    HAVE_SIGNAL    TRUE    /* Compiler supports signal() */
  464. X#endif
  465. X
  466. X#ifdef __STDC__
  467. X#define    HAVE_LONGJUMP    TRUE
  468. X#else
  469. X#define    HAVE_LONGJUMP    TRUE    /* Compiler supports setjmp() and longjmp() */
  470. X#endif
  471. X
  472. X/* configure sets this */
  473. X#ifndef HAVE_RAISE
  474. X#define HAVE_RAISE    FALSE    /* Compiler supports raise() */
  475. X#endif
  476. X
  477. X/* configure sets this */
  478. X#ifndef HAVE_STRING
  479. X#define    HAVE_STRING    FALSE    /* Compiler has <string.h> header */
  480. X#endif
  481. X
  482. X/* configure sets this */
  483. X#ifndef HAVE_STDLIB
  484. X#define HAVE_STDLIB    FALSE    /* Compiler has <stdlib.h> header */
  485. X#endif
  486. X
  487. X#ifdef __STDC__
  488. X#define HAVE_SYSTYPES    TRUE
  489. X#else
  490. X#define HAVE_SYSTYPES    TRUE    /* Compiler has <sys/types.h> header */
  491. X#endif
  492. X
  493. X#ifdef __STDC__
  494. X#define HAVE_SYSSTAT    TRUE
  495. X#else
  496. X#define HAVE_SYSSTAT    TRUE    /* Compiler has <sys/stat.h> header */
  497. X#endif
  498. X
  499. X/***************************************************************
  500. X
  501. X    bwbasic.h:    Part I-C: Define Program Configuration
  502. X
  503. X            You must specify one and only one of the
  504. X            following progrm configurations as TRUE.
  505. X            If you specify CFG_CUSTOM, then you will
  506. X            need to fill out the custom section below.
  507. X
  508. X***************************************************************/
  509. X
  510. X#define    CFG_ANSIMINIMAL    FALSE   /* Conforms to ANSI Minimal BASIC standard X3.60-1978 */
  511. X#define CFG_COMMON      FALSE   /* Small implementation with commands and functions common to GWBASIC (tm) and ANSI full BASIC */
  512. X#define CFG_MSTYPE      FALSE   /* Configuration similar to Microsoft line-oriented BASICs */
  513. X#define    CFG_ANSIFULL    FALSE    /* Conforms to ANSI Full BASIC standard X3.113-1987 */
  514. X#define CFG_CUSTOM      TRUE    /* Custom Configuration specified below */
  515. X
  516. X/***************************************************************
  517. X
  518. X    bwbasic.h:    Part I-D: Define Custom Program Configuration
  519. X
  520. X            If you specified CFG_CUSTOM above, then
  521. X            you will need to fill out this section.
  522. X
  523. X***************************************************************/
  524. X
  525. X#if CFG_CUSTOM
  526. X#define COMMAND_SHELL   TRUE        /* allow command shell processing */
  527. X#define PROFILE         FALSE           /* interpret profile at beginning */
  528. X#define NUMBER_DOUBLE    FALSE        /* define BASIC number as double: default is float*/
  529. X#define MULTISEG_LINES  TRUE            /* allow multi-segment lines delimited by ':' */
  530. X#define PARACT        FALSE        /* Implement PARallen ACTion (Multi-tasking) interpreter */
  531. X#define INTERACTIVE    TRUE        /* interactive programming environment and related commands */
  532. X#define COMMON_CMDS    TRUE        /* commands common to ANSI full BASIC and GWBASIC */
  533. X#if UNIX_CMDS
  534. X#define UNIX_CMDS    TRUE         /* implement Unix-style directory commands  */
  535. X#endif
  536. X#define STRUCT_CMDS     TRUE           /* commands for structured programming required by full ANSI BASIC */
  537. X#define MS_CMDS         TRUE            /* commands specific to Microsoft GWBASIC (tm) */
  538. X#define MS_FUNCS        TRUE            /* Microsoft-specific functions and commands */
  539. X#define    COMMON_FUNCS    TRUE        /* functions common to GWBASIC and ANSI full BASIC */
  540. X#define ANSI_FUNCS    TRUE        /* functions required by ANSI full BASIC */
  541. X#endif                    /* end of CFG_CUSTOM */
  542. X
  543. X/***************************************************************
  544. X
  545. X    bwbasic.h:    Part I-E: Define Natural Language for Messages
  546. X
  547. X            One and only one of the following must be
  548. X            defined as TRUE.  Note that the language
  549. X            definitions themselves are in file bwb_mes.h.
  550. X            If none is specified, then ENGLISH will be
  551. X            taken as the default.
  552. X
  553. X***************************************************************/
  554. X
  555. X#define STD_ENGLISH     TRUE            /* standard English */
  556. X#define POL_ENGLISH     FALSE        /* polite English messages */
  557. X#define IMP_ENGLISH    FALSE        /* impolite English messages */
  558. X#define LATIN        FALSE        /* Latin language messages */
  559. X#define STD_RUSSIAN    FALSE        /* Russian language messages */
  560. X#define STD_GERMAN      FALSE           /* German language messages */
  561. X#define ESPERANTO       FALSE           /* Esperanto messages */
  562. X
  563. X/***************************************************************
  564. X
  565. X    bwbasic.h:    Part I-F: Define Debugging Options
  566. X
  567. X            You can specify debugging options here.
  568. X
  569. X***************************************************************/
  570. X
  571. X#define DEBUG           FALSE         /* current debugging */
  572. X#define PROG_ERRORS     FALSE       /* identify serious programming errors */
  573. X                    /* and print extensive error messages */
  574. X                    /* This will override messages defined in */
  575. X                    /* bwb_mes.h, and almost all messages will be in English */
  576. X#define CHECK_RECURSION FALSE        /* check for recursion violation in expression parser */
  577. X#define INTENSIVE_DEBUG FALSE           /* old debugging; might be useful later */
  578. X#define REDIRECT_STDERR FALSE           /* Redirect stderr to file ERRFILE */
  579. X#define TEST_BSTRING    FALSE           /* test bstring integrity */
  580. X
  581. X#ifdef __STDC__
  582. X#define ANSI_C          TRUE            /* FALSE to test and debug non-ANSI-C version
  583. X                       with ANSI C compiler (watch out) */
  584. X#endif
  585. X
  586. X/***************************************************************
  587. X
  588. X    bwbasic.h:    This ends the section of definitions that
  589. X            users of bwBASIC will normally need to
  590. X            specify. The following are internally defined
  591. X
  592. X***************************************************************/
  593. X
  594. X#if CFG_ANSIMINIMAL
  595. X#define COMMAND_SHELL   FALSE        /* allow command shell processing */
  596. X#define PROFILE        FALSE        /* interpret profile at beginning */
  597. X#define NUMBER_DOUBLE    FALSE        /* define BASIC number as double: default is float*/
  598. X#define MULTISEG_LINES    FALSE        /* allow multi-segment lines delimited by ':' */
  599. X#define PARACT        FALSE        /* Implement PARallen ACTion (Multi-tasking) interpreter */
  600. X#define INTERACTIVE    TRUE        /* interactive programming environment and related commands */
  601. X#define COMMON_CMDS    FALSE        /* commands common to ANSI full BASIC and GWBASIC */
  602. X#if UNIX_CMDS
  603. X#define UNIX_CMDS    FALSE         /* implement Unix-style directory commands  */
  604. X#endif
  605. X#define STRUCT_CMDS    FALSE        /* commands for structured programming required by full ANSI BASIC */
  606. X#define MS_CMDS    FALSE        /* commands specific to Microsoft GWBASIC (tm) */
  607. X#define MS_FUNCS    FALSE        /* Microsoft-specific functions and commands */
  608. X#define    COMMON_FUNCS    FALSE        /* functions common to GWBASIC and ANSI full BASIC */
  609. X#define ANSI_FUNCS    FALSE        /* functions required by ANSI full BASIC */
  610. X#endif                    /* end of CFG_ANSIMINIMAL */
  611. X
  612. X#if CFG_COMMON
  613. X#define COMMAND_SHELL   FALSE        /* allow command shell processing */
  614. X#define PROFILE        FALSE        /* interpret profile at beginning */
  615. X#define NUMBER_DOUBLE    FALSE        /* define BASIC number as double: default is float*/
  616. X#define MULTISEG_LINES    FALSE        /* allow multi-segment lines delimited by ':' */
  617. X#define PARACT        FALSE        /* Implement PARallen ACTion (Multi-tasking) interpreter */
  618. X#define INTERACTIVE    TRUE        /* interactive programming environment and related commands */
  619. X#define COMMON_CMDS    TRUE        /* commands common to ANSI full BASIC and GWBASIC */
  620. X#if UNIX_CMDS
  621. X#define UNIX_CMDS    FALSE         /* implement Unix-style directory commands  */
  622. X#endif
  623. X#define STRUCT_CMDS    FALSE        /* commands for structured programming required by full ANSI BASIC */
  624. X#define MS_CMDS    FALSE        /* commands specific to Microsoft GWBASIC (tm) */
  625. X#define MS_FUNCS    FALSE        /* Microsoft-specific functions and commands */
  626. X#define    COMMON_FUNCS    TRUE        /* functions common to GWBASIC and ANSI full BASIC */
  627. X#define ANSI_FUNCS    FALSE        /* functions required by ANSI full BASIC */
  628. X#endif                    /* end of CFG_COMMON */
  629. X
  630. X#if CFG_ANSIFULL
  631. X#define COMMAND_SHELL   TRUE        /* allow command shell processing */
  632. X#define PROFILE        TRUE        /* interpret profile at beginning */
  633. X#define NUMBER_DOUBLE    FALSE        /* define BASIC number as double: default is float*/
  634. X#define MULTISEG_LINES    FALSE        /* allow multi-segment lines delimited by ':' */
  635. X#define PARACT        TRUE        /* Implement PARallen ACTion (Multi-tasking) interpreter */
  636. X#define INTERACTIVE    TRUE        /* interactive programming environment and related commands */
  637. X#define COMMON_CMDS    TRUE        /* commands common to ANSI full BASIC and GWBASIC */
  638. X#if UNIX_CMDS
  639. X#define UNIX_CMDS    FALSE         /* implement Unix-style directory commands  */
  640. X#endif
  641. X#define STRUCT_CMDS    TRUE        /* commands for structured programming required by full ANSI BASIC */
  642. X#define MS_CMDS    FALSE        /* commands specific to Microsoft GWBASIC (tm) */
  643. X#define MS_FUNCS    FALSE        /* Microsoft-specific functions and commands */
  644. X#define    COMMON_FUNCS    TRUE        /* functions common to GWBASIC and ANSI full BASIC */
  645. X#define ANSI_FUNCS    TRUE        /* functions required by ANSI full BASIC */
  646. X#endif                    /* end of CFG_ANSIFULL */
  647. X
  648. X#if CFG_MSTYPE
  649. X#define COMMAND_SHELL   FALSE        /* allow command shell processing */
  650. X#define PROFILE        FALSE        /* interpret profile at beginning */
  651. X#define NUMBER_DOUBLE    FALSE        /* define BASIC number as double: default is float*/
  652. X#define MULTISEG_LINES    TRUE        /* allow multi-segment lines delimited by ':' */
  653. X#define PARACT        FALSE        /* Implement PARallen ACTion (Multi-tasking) interpreter */
  654. X#define INTERACTIVE    TRUE        /* interactive programming environment and related commands */
  655. X#define COMMON_CMDS    TRUE        /* commands common to ANSI full BASIC and GWBASIC */
  656. X#define STRUCT_CMDS    FALSE        /* commands for structured programming required by full ANSI BASIC */
  657. X#define MS_CMDS    TRUE        /* commands specific to Microsoft GWBASIC (tm) */
  658. X#define MS_FUNCS    TRUE        /* Microsoft-specific functions and commands */
  659. X#define    COMMON_FUNCS    TRUE        /* functions common to GWBASIC and ANSI full BASIC */
  660. X#define ANSI_FUNCS    FALSE        /* functions required by ANSI full BASIC */
  661. X#endif                                  /* end of CFG_MSTYPE */
  662. X
  663. X/* inclusions and definitions necessary if C compiler is not ANSI compliant */
  664. X
  665. X#if HAVE_STRING
  666. X#include <string.h>
  667. X#else
  668. X#include <strings.h>
  669. X#endif
  670. X
  671. X#if HAVE_STDLIB
  672. X#include <stdlib.h>
  673. X#endif
  674. X
  675. X#if HAVE_SYSTYPES
  676. X#include <sys/types.h>
  677. X#endif
  678. X
  679. X#if HAVE_STDLIB                /* if neither ANSI */
  680. X#else
  681. X#if HAVE_SYSTYPES            /* nor SYSTYPES */
  682. X#else
  683. X#define size_t    unsigned int        /* then define these */
  684. X#define time_t     long 
  685. X#endif
  686. X#endif
  687. X
  688. X/* define number of commands */
  689. X
  690. X#define CMDS_CORE       22              /* number of core commands defined */
  691. X#if UNIX_CMDS
  692. X#define CMDS_DIR    5
  693. X#else
  694. X#define CMDS_DIR    0
  695. X#endif
  696. X#if COMMON_CMDS
  697. X#define CMDS_COMMON    24
  698. X#else
  699. X#define CMDS_COMMON    0
  700. X#endif
  701. X#if STRUCT_CMDS
  702. X#define CMDS_STC    10
  703. X#else
  704. X#define CMDS_STC    0
  705. X#endif
  706. X#if INTERACTIVE
  707. X#define CMDS_INT    8
  708. X#else
  709. X#define CMDS_INT    0
  710. X#endif
  711. X#if MS_CMDS
  712. X#define CMDS_MS         5+IMP_CMDCLS+IMP_CMDLOC+IMP_CMDCOLOR
  713. X#else
  714. X#define CMDS_MS        0
  715. X#endif
  716. X#if DEBUG
  717. X#define CMDS_DEBUG      3               /* number of debugging cmds */
  718. X#else
  719. X#define CMDS_DEBUG      0               /* no debugging cmds */
  720. X#endif
  721. X#define COMMANDS        (CMDS_CORE+CMDS_DEBUG+CMDS_DIR+CMDS_COMMON+CMDS_INT+CMDS_MS+CMDS_STC)
  722. X
  723. X/* define number of functions */
  724. X
  725. X#define FUNCS_BASE      12        /* number of basic functions */
  726. X#ifdef INTENSIVE_DEBUG
  727. X#define FUNCS_DEBUG    1        /* number of debugging functions */
  728. X#else
  729. X#define FUNCS_DEBUG    0        /* number of debugging functions */
  730. X#endif
  731. X#if MS_FUNCS
  732. X#define FUNCS_MS        (25+IMP_FNCINKEY)
  733. X#else
  734. X#define FUNCS_MS    0
  735. X#endif
  736. X#if COMMON_FUNCS
  737. X#define FUNCS_COMMON    7
  738. X#else
  739. X#define FUNCS_COMMON    0
  740. X#endif
  741. X#if ANSI_FUNCS
  742. X#define FUNCS_ANSI    0
  743. X#else
  744. X#define FUNCS_ANSI    0
  745. X#endif
  746. X#define FUNCTIONS    (FUNCS_BASE+FUNCS_DEBUG+FUNCS_MS+FUNCS_COMMON+FUNCS_ANSI)
  747. X
  748. X/* Check for inconsistencies */
  749. X
  750. X#if MULTISEG_LINES & STRUCT_CMDS
  751. X/* ERROR:  MULTISEG_LINES and STRUCT_CMDS cannot be defined together! */
  752. X#endif
  753. X
  754. X#define DEF_EDITOR      ""              /* default editor */
  755. X#define DEF_FILES       ""              /* default "files" command */
  756. X#define DEF_COLORS      0               /* default # of colors */
  757. X#define DEFVNAME_EDITOR "BWB.EDITOR$"   /* default variable name for EDITOR */
  758. X#define DEFVNAME_PROMPT "BWB.PROMPT$"   /* default variable name for PROMPT */
  759. X#define DEFVNAME_FILES  "BWB.FILES$"    /* default variable name for FILES */
  760. X#define DEFVNAME_COLORS "BWB.COLORS"    /* default variable name for COLORS */
  761. X#define DEFVNAME_IMPL   "BWB.IMPLEMENTATION$" /* default variable name for IMPLEMENTATION */
  762. X#define ERRFILE         "err.out"       /* Filename for redirected error messages */
  763. X#define PROFILENAME    "profile.bas"    /* Filename for profile execution */
  764. X#define    TASKS        4        /* number of tasks available */
  765. X#define MAXARGSIZE      128             /* maximum size of argument */
  766. X#define MAXREADLINESIZE 256             /* size of read_line buffer */
  767. X#define MAXCMDNAMESIZE  64              /* maximum size for command name */
  768. X#define MAXLINENO       32766           /* maximum line number */
  769. X#define MAXVARNAMESIZE  40              /* maximum size for variable name */
  770. X#define MAXFILENAMESIZE 40              /* maximum size for file name */
  771. X#define MAXSTRINGSIZE   255             /* maximum string length */
  772. X#define EXECLEVELS      64              /* EXEC stack levels */
  773. X#define MAX_GOLINES     12              /* Maximum # of lines for ON...GOTO statements */
  774. X#define MAX_FARGS       6               /* maximum # arguments to function */
  775. X#define MAX_DIMS    64        /* maximum # of dimensions */
  776. X#define ESTACKSIZE      64              /* elements in expression stack */
  777. X#define XTXTSTACKSIZE   16              /* elements in eXecute TeXT stack */
  778. X#define N_OPERATORS     24              /* number of operators defined */
  779. X#define N_ERRORS    25        /* number of errors defined */
  780. X#define MAX_PRECEDENCE  19              /* highest (last) level of precedence */
  781. X#define MININTSIZE      -32767          /* minimum integer size */
  782. X#define MAXINTSIZE       32767          /* maximum integer size */
  783. X#define DEF_SUBSCRIPT   11              /* default subscript */
  784. X#define DEF_DEVICES     16              /* default number of devices available */
  785. X#define DEF_WIDTH    128        /* default width for devices */
  786. X#define PRN_TAB        0x02        /* send TAB followed by col number to output device */
  787. X#define COMPRESS_FUNCS  TRUE
  788. X
  789. X/* Derivative definitions */
  790. X
  791. X#if MULTISEG_LINES
  792. X#define MARK_LINES    FALSE
  793. X#else
  794. X#define MARK_LINES    TRUE
  795. X#endif
  796. X
  797. X#if PARACT
  798. X#define CURTASK        bwb_tasks[ bwb_curtask ]->
  799. X#define LOCALTASK    bwb_tasks[ task ]->
  800. X#else
  801. X#define CURTASK
  802. X#define LOCALTASK
  803. X#endif
  804. X
  805. X#if DEBUG
  806. X#define PERMANENT_DEBUG TRUE
  807. X#else
  808. X#define PERMANENT_DEBUG FALSE
  809. X#endif
  810. X
  811. X#if HAVE_STDLIB
  812. X#else
  813. Xextern char *calloc();
  814. X
  815. X#ifndef NULL
  816. X#define NULL    0L
  817. X#endif
  818. X
  819. X#endif
  820. X
  821. X/* typedef for BASIC number */
  822. X
  823. X#if NUMBER_DOUBLE
  824. Xtypedef double bnumber;
  825. X#else
  826. Xtypedef float bnumber;
  827. X#endif
  828. X
  829. X/* define variable types based on last character */
  830. X
  831. X#define STRING          '$'
  832. X
  833. X/* define mathematical operations */
  834. X
  835. X#define MULTIPLY        '*'
  836. X#define DIVIDE          '/'
  837. X#define ADD             '+'
  838. X#define SUBTRACT        '-'
  839. X#define ARGUMENT        'A'
  840. X
  841. X/* Operations defined */
  842. X
  843. X#define OP_ERROR        -255        /* operation error (break out) */
  844. X#define OP_NULL         0               /* null: operation not defined yet */
  845. X#define NUMBER          1               /* number held as internal variable in uvar */
  846. X#define CONST_STRING    2               /* string constant */
  847. X#define CONST_NUMERICAL 3               /* numerical constant */
  848. X#define FUNCTION        4               /* function header */
  849. X#define VARIABLE        5               /* external variable pointed to by xvar */
  850. X#define PARENTHESIS     6               /* begin parenthetical expression */
  851. X#define OP_ADD          7               /* addition sign '+' */
  852. X#define OP_SUBTRACT     8               /* subtraction sign '-' */
  853. X#define OP_MULTIPLY     9               /* multiplication sign '*' */
  854. X#define OP_DIVIDE       10              /* division sign '/' */
  855. X#define OP_MODULUS      11              /* modulus "MOD" */
  856. X#define OP_EXPONENT     12              /* exponentiation '^' */
  857. X#define OP_INTDIVISION  13              /* integer division sign '\' */
  858. X#define OP_NEGATION     14              /* negation '-' ??? */
  859. X#define OP_STRJOIN      15              /* string join ';' */
  860. X#define OP_STRTAB       16              /* string tab ',' */
  861. X#define OP_EQUALS       17              /* either logical equal operator */
  862. X#define OP_ASSIGN       18              /* assignment operator */
  863. X#define OP_NOTEQUAL     20              /* inequality */
  864. X#define OP_LESSTHAN     21              /* less than */
  865. X#define OP_GREATERTHAN  22              /* greater than */
  866. X#define OP_LTEQ         23              /* less than or equal to */
  867. X#define OP_GTEQ         24              /* greater than or equal to */
  868. X#define OP_NOT          25              /* negation */
  869. X#define OP_AND          26              /* conjunction */
  870. X#define OP_OR           27              /* disjunction */
  871. X#define OP_XOR          28              /* exclusive or */
  872. X#define OP_IMPLIES      29              /* implication */
  873. X#define OP_EQUIV        30              /* equivalence */
  874. X#define OP_TERMINATE    31              /* terminate expression parsing */
  875. X#define OP_USERFNC    32        /* user-defined function */
  876. X
  877. X/* Device input/output modes */
  878. X
  879. X#define DEVMODE_AVAILABLE  -1
  880. X#define DEVMODE_CLOSED     0
  881. X#define DEVMODE_OUTPUT     1
  882. X#define DEVMODE_INPUT      2
  883. X#define DEVMODE_APPEND     3
  884. X#define DEVMODE_RANDOM     4
  885. X
  886. X/* codes for EXEC stack and for function-sub-label lookup table */
  887. X
  888. X#define EXEC_NORM    0
  889. X#define    EXEC_GOSUB    1
  890. X#define    EXEC_WHILE    2
  891. X#define EXEC_FOR        3
  892. X#define EXEC_FUNCTION    4
  893. X#define EXEC_CALLSUB    5
  894. X#define EXEC_IFTRUE    6
  895. X#define EXEC_IFFALSE    7
  896. X#define EXEC_MAIN    8
  897. X#define EXEC_SELTRUE    9
  898. X#define EXEC_SELFALSE    10
  899. X#define EXEC_LABEL      11
  900. X#define EXEC_DO         12
  901. X#define EXEC_ON         13
  902. X
  903. X/***************************************************************
  904. X
  905. X    bwbasic.h    Part II: Structures
  906. X
  907. X***************************************************************/
  908. X
  909. X/* Typdef structure for strings under Bywater BASIC */
  910. X
  911. Xtypedef struct bstr
  912. X   {
  913. X   unsigned char length;        /* length of string */
  914. X   char *sbuffer;            /* pointer to string buffer */
  915. X   int rab;                /* is it a random-access buffer? */
  916. X#if TEST_BSTRING
  917. X   char name[ MAXVARNAMESIZE + 1 ];    /* name for test purposes */
  918. X#endif
  919. X   } bstring;
  920. X
  921. X/* Structure used for all variables under Bywater BASIC */
  922. X
  923. Xstruct bwb_variable
  924. X   {
  925. X   char name[ MAXVARNAMESIZE + 1 ];    /* name */
  926. X   int type;                            /* type, i.e., STRING or NUMBER */
  927. X#if OLDWAY
  928. X   void *array;                /* pointer to array memory */
  929. X#endif
  930. X   bnumber *memnum;            /* memory for number */
  931. X   bstring *memstr;            /* memory for string */
  932. X   size_t array_units;            /* total number of units of memory */
  933. X   int  *array_sizes;            /* pointer to array of <dimensions>
  934. X                                           integers, with sizes of each
  935. X                                           dimension */
  936. X   int *array_pos;                      /* current position in array */
  937. X   int dimensions;                      /* number of dimensions,
  938. X                                           0 = not an array */
  939. X   struct bwb_variable *next;           /* next variable in chain */
  940. X   int common;                /* should this variable be common to chained programs? */
  941. X   int preset;                /* preset variable: CLEAR should not alter */
  942. X   };
  943. X
  944. X/* Structure to represent program lines under Bywater BASIC */
  945. X
  946. Xstruct bwb_line
  947. X   {
  948. X   struct bwb_line *next;               /* pointer to next line in chain */
  949. X   int number;                          /* line number */
  950. X   char xnum;                /* is there actually a line number? */
  951. X   char *buffer;            /* buffer to hold the line */
  952. X   int position;                        /* current position in line */
  953. X   int lnpos;                           /* line number position in buffer */
  954. X   int lnum;                            /* line number read from buffer */
  955. X   int cmdpos;                          /* command position in buffer */
  956. X   int cmdnum;                          /* number of command in command table
  957. X                                           read from buffer */
  958. X   int startpos;                        /* start of rest of line read from buffer */
  959. X   int marked;                          /* has line been checked yet? */
  960. X   };
  961. X
  962. X/* Structure used for all predefined functions under Bywater BASIC */
  963. X
  964. Xstruct bwb_function
  965. X   {
  966. X   char name[ MAXVARNAMESIZE + 1 ];     /* name */
  967. X   int type;                            /* type, i.e., STRING or NUMBER */
  968. X   int arguments;                       /* number of args passed */
  969. X#if ANSI_C
  970. X   struct bwb_variable * (*vector) ( int argc, struct bwb_variable *argv, int unique_id );  /* vector to function to call */
  971. X#else
  972. X   struct bwb_variable * (*vector) ();  /* vector to function to call */
  973. X#endif
  974. X   struct bwb_function *next;           /* next function in chain */
  975. X   int id;                              /* id to identify multiple functions */
  976. X   };
  977. X
  978. X/* Structure to represent all command statements under Bywater BASIC */
  979. X
  980. Xstruct bwb_command
  981. X   {
  982. X   char name[ MAXCMDNAMESIZE + 1 ];
  983. X#if ANSI_C
  984. X   struct bwb_line * (*vector) (struct bwb_line *);
  985. X#else
  986. X   struct bwb_line * (*vector) ();
  987. X#endif
  988. X   };
  989. X
  990. X/* Structure to define device stack for Bywater BASIC */
  991. X
  992. Xstruct dev_element
  993. X   {
  994. X   int mode;                            /* DEVMODE_ item */
  995. X   int width;                /* width for output control */
  996. X   int col;                /* current column */
  997. X   int reclen;                          /* record length for random access */
  998. X   int next_record;            /* next record to read/write */
  999. X   int loc;                /* location in file */
  1000. X   char filename[ MAXFILENAMESIZE + 1 ];/* filename */
  1001. X   FILE *cfp;                           /* C file pointer for this device */
  1002. X   char *buffer;            /* pointer to character buffer for random access */
  1003. X   };
  1004. X
  1005. X/* Structure to define expression stack elements under Bywater BASIC */
  1006. X
  1007. Xstruct exp_ese
  1008. X   {
  1009. X   int operation;                       /* operation at this level */
  1010. X   char type;                /* type of operation at this level:
  1011. X                          STRING or NUMBER */
  1012. X   bstring sval;            /* string */
  1013. X   bnumber nval;            /* number */
  1014. X   char string[ MAXSTRINGSIZE + 1 ];     /* string for writing */
  1015. X   struct bwb_variable *xvar;           /* pointer to external variable */
  1016. X   struct bwb_function *function;       /* pointer to function structure */
  1017. X   int array_pos[ MAX_DIMS ];        /* array for variable positions */
  1018. X   int pos_adv;                         /* position advanced in string */
  1019. X   int rec_pos;                         /* position marker for recursive calls */
  1020. X   };
  1021. X
  1022. X/* structure for FUNCTION-SUB loopup table element */
  1023. X
  1024. Xstruct fslte
  1025. X   {
  1026. X   char *name;
  1027. X   struct bwb_line *line;
  1028. X   int code;
  1029. X   int startpos;            /* starting position in line */
  1030. X   struct fslte *next;
  1031. X   struct bwb_variable *local_variable;
  1032. X   };
  1033. X
  1034. X/* Structure to define EXEC stack elements */
  1035. X
  1036. Xstruct exse
  1037. X   {
  1038. X   struct bwb_line *line;        /* line for execution */
  1039. X   int code;                /* code to note special operations */
  1040. X   int position;            /* position in line for restore */
  1041. X   struct bwb_variable *local_variable;    /* local variable chain and current FOR counter */
  1042. X   struct bwb_variable *calling_variable[ MAX_FARGS ];
  1043. X   int n_cvs;                /* number of calling variables */
  1044. X   int for_step;            /* STEP value for FOR */
  1045. X   int for_target;            /* target value for FOR */
  1046. X   struct bwb_line *while_line;        /* return line for current WHILE */
  1047. X   struct bwb_line *wend_line;          /* breakout line for current WHILE (or FOR-NEXT) */
  1048. X   struct exp_ese expression;        /* expression for evaluation by SELECT CASE */
  1049. X#if MULTISEG_LINES
  1050. X   struct bwb_line *for_line;           /* top line for FOR-NEXT loop, multisegmented */
  1051. X   int for_position;                    /* position in top line for FOR-NEXT loop, multisegmented */
  1052. X#endif
  1053. X   };
  1054. X
  1055. Xstruct xtxtsl
  1056. X   {
  1057. X   int  position;
  1058. X   struct bwb_line l;
  1059. X   };
  1060. X
  1061. X/* Structure to define bwBASIC task: UNDER CONSTRUCTION */
  1062. X
  1063. X#if PARACT
  1064. Xstruct bwb_task
  1065. X   {
  1066. X   char progfile[ MAXARGSIZE ];        /* program file */
  1067. X   int rescan;                /* program needs to be rescanned */
  1068. X   int number;                /* current line number */
  1069. X   struct bwb_line *bwb_l;        /* current line pointer */
  1070. X   struct bwb_line bwb_start;        /* starting line marker */
  1071. X   struct bwb_line bwb_end;        /* ending line marker */
  1072. X   struct bwb_line *data_line;          /* current line to read data */
  1073. X   int data_pos;            /* position in data_line */
  1074. X   struct bwb_variable var_start;    /* variable list start marker */
  1075. X   struct bwb_variable var_end;        /* variable list end marker */
  1076. X   struct bwb_function fnc_start;    /* function list start marker */
  1077. X   struct bwb_function fnc_end;        /* function list end marker */
  1078. X   struct fslte fslt_start;        /* function-sub-label lookup table start marker */
  1079. X   struct fslte fslt_end;        /* function-sub-label lookup table end marker */
  1080. X   int exsc;                /* EXEC stack counter */
  1081. X   int expsc;                /* expression stack counter */
  1082. X   int xtxtsc;                /* eXecute TeXT stack counter */
  1083. X   struct exse excs[ EXECLEVELS ];    /* EXEC stack */
  1084. X   struct exp_ese exps[ ESTACKSIZE ];    /* Expression stack */
  1085. X   struct xtxtsl xtxts[ XTXTSTACKSIZE ];/* Execute Text stack */
  1086. X   };
  1087. X
  1088. Xextern struct bwb_task *bwb_tasks[ TASKS ];    /* table of task pointers */
  1089. X
  1090. X#else                    /* not multi-tasking */
  1091. X
  1092. Xextern char progfile[ MAXARGSIZE ];    /* program file */
  1093. Xextern int rescan;            /* program needs to be rescanned */
  1094. Xextern int number;            /* current line number */
  1095. Xextern struct bwb_line *bwb_l;        /* current line pointer */
  1096. Xextern struct bwb_line bwb_start;    /* starting line marker */
  1097. Xextern struct bwb_line bwb_end;        /* ending line marker */
  1098. Xextern struct bwb_line *data_line;      /* current line to read data */
  1099. Xextern int data_pos;            /* position in data_line */
  1100. Xextern struct bwb_variable var_start;    /* variable list start marker */
  1101. Xextern struct bwb_variable var_end;    /* variable list end marker */
  1102. Xextern struct bwb_function fnc_start;    /* function list start marker */
  1103. Xextern struct bwb_function fnc_end;    /* function list end marker */
  1104. Xextern struct fslte fslt_start;        /* function-sub-label lookup table start marker */
  1105. Xextern struct fslte fslt_end;        /* function-sub-label lookup table end marker */
  1106. Xextern int exsc;            /* EXEC stack counter */
  1107. Xextern int expsc;            /* expression stack counter */
  1108. Xextern int xtxtsc;            /* eXecute TeXT stack counter */
  1109. Xextern struct exse *excs;        /* EXEC stack */
  1110. Xextern struct exp_ese *exps;        /* Expression stack */
  1111. Xextern struct xtxtsl *xtxts;        /* Execute Text stack */
  1112. X#endif
  1113. X
  1114. Xextern int bwb_curtask;            /* current task */
  1115. Xextern struct bwb_variable *ed;         /* EDITOR$ variable */
  1116. Xextern struct bwb_variable *fi;         /* FILES$ variable */
  1117. Xextern struct bwb_variable *pr;         /* PROMPT$ variable */
  1118. Xextern struct bwb_variable *im;         /* IMPLEMENTATION$ variable */
  1119. Xextern struct bwb_variable *co;         /* COLORS variable */
  1120. X
  1121. X/***************************************************************
  1122. X
  1123. X    bwbasic.h    Part III: Global Data
  1124. X
  1125. X***************************************************************/
  1126. X
  1127. Xextern char *bwb_ebuf;
  1128. Xextern int bwb_trace;
  1129. Xextern int dim_base;            /* set by OPTION BASE */
  1130. Xextern struct bwb_command bwb_cmdtable[ COMMANDS ];
  1131. Xextern FILE *errfdevice;                /* output device for error messages */
  1132. Xextern int err_line;            /* line in which error occurred */
  1133. Xextern int err_number;            /* number of last error */
  1134. Xextern char err_gosubl[ MAXVARNAMESIZE + 1 ]; /* line for error GOSUB */
  1135. Xextern char *err_table[ N_ERRORS ];    /* table of error messages */
  1136. Xextern int prn_col;
  1137. Xextern struct bwb_function bwb_prefuncs[ FUNCTIONS ];    /* table of predefined functions */
  1138. X
  1139. X#if COMMON_CMDS
  1140. Xextern struct dev_element *dev_table;   /* table of devices */
  1141. X#endif
  1142. X
  1143. X/* Operator Structure and Table */
  1144. X
  1145. Xstruct bwb_op
  1146. X   {
  1147. X   char symbol[ 8 ];                    /* BASIC symbol for the operator */
  1148. X   int operation;                       /* internal code for the operator */
  1149. X   int precedence;                      /* level of precedence, 0 = highest */
  1150. X   };
  1151. X
  1152. Xextern struct bwb_op exp_ops[ N_OPERATORS ]; /* the table itself, filled in in bwb_tbl.c */
  1153. X
  1154. X/***************************************************************
  1155. X
  1156. X    bwbasic.h    Part IV: Function Prototypes
  1157. X
  1158. X***************************************************************/
  1159. X
  1160. X#if ANSI_C
  1161. Xextern void bwb_init( int argc, char **argv );
  1162. Xextern int bwb_fload( FILE *file );
  1163. Xextern int bwb_ladd( char *buffer, int replace );
  1164. Xextern int bwb_findcmd( int argc, int a, struct bwb_line *l );
  1165. Xextern struct bwb_line *bwb_xtxtline( char *buffer );
  1166. Xextern void bwb_mainloop( void );
  1167. Xextern void bwb_execline( void );
  1168. Xextern int bwb_gets( char *buffer );
  1169. Xextern int bwb_error( char *message );
  1170. Xextern void break_handler( void );
  1171. Xextern void break_mes( int x );
  1172. Xextern struct bwb_line *bwb_null( struct bwb_line *l );
  1173. Xextern struct bwb_line *bwb_rem( struct bwb_line *l );
  1174. Xextern struct bwb_line *bwb_lerror( struct bwb_line *l );
  1175. Xextern struct bwb_line *bwb_run( struct bwb_line *l );
  1176. Xextern struct bwb_line *bwb_let( struct bwb_line *l );
  1177. Xextern struct bwb_line *bwb_load( struct bwb_line *l );
  1178. Xextern struct bwb_line *bwb_merge( struct bwb_line *l );
  1179. Xextern struct bwb_line *bwb_chain( struct bwb_line *l );
  1180. Xextern struct bwb_line *bwb_common( struct bwb_line *l );
  1181. Xextern struct bwb_line *bwb_xload( struct bwb_line *l );
  1182. Xextern struct bwb_line *bwb_new( struct bwb_line *l );
  1183. Xextern struct bwb_line *bwb_save( struct bwb_line *l );
  1184. Xextern struct bwb_line *bwb_list( struct bwb_line *l );
  1185. Xextern struct bwb_line *bwb_xlist( struct bwb_line *l, FILE *file );
  1186. Xextern struct bwb_line *bwb_go( struct bwb_line *l );
  1187. Xextern struct bwb_line *bwb_goto( struct bwb_line *l );
  1188. Xextern struct bwb_line *bwb_gosub( struct bwb_line *l );
  1189. Xextern struct bwb_line *bwb_return( struct bwb_line *l );
  1190. Xextern struct bwb_line *bwb_xend( struct bwb_line *l );
  1191. Xextern struct bwb_line *bwb_system( struct bwb_line *l );
  1192. Xextern struct bwb_line *bwb_tron( struct bwb_line *l );
  1193. Xextern struct bwb_line *bwb_troff( struct bwb_line *l );
  1194. Xextern struct bwb_line *bwb_randomize( struct bwb_line *l );
  1195. Xextern struct bwb_line *bwb_stop( struct bwb_line *l );
  1196. Xextern struct bwb_line *bwb_data( struct bwb_line *l );
  1197. Xextern struct bwb_line *bwb_read( struct bwb_line *l );
  1198. Xextern struct bwb_line *bwb_restore( struct bwb_line *l );
  1199. Xextern struct bwb_line *bwb_delete( struct bwb_line *l );
  1200. Xextern struct bwb_line *bwb_if( struct bwb_line *l );
  1201. Xextern struct bwb_line *bwb_else( struct bwb_line *l );
  1202. Xextern struct bwb_line *bwb_elseif( struct bwb_line *l );
  1203. Xextern struct bwb_line *bwb_select( struct bwb_line *l );
  1204. Xextern struct bwb_line *bwb_case( struct bwb_line *l );
  1205. Xextern struct bwb_line *bwb_endselect( struct bwb_line *l );
  1206. Xextern struct bwb_line *bwb_endif( struct bwb_line *l );
  1207. Xextern struct bwb_line *bwb_while( struct bwb_line *l );
  1208. Xextern struct bwb_line *bwb_wend( struct bwb_line *l );
  1209. Xextern struct bwb_line *bwb_for( struct bwb_line *l );
  1210. Xextern struct bwb_line *bwb_next( struct bwb_line *l );
  1211. Xextern struct bwb_line *bwb_dim( struct bwb_line *l );
  1212. Xextern struct bwb_line *bwb_option( struct bwb_line *l );
  1213. Xextern struct bwb_line *bwb_open( struct bwb_line *l );
  1214. Xextern struct bwb_line *bwb_close( struct bwb_line *l );
  1215. Xextern struct bwb_line *bwb_get( struct bwb_line *l );
  1216. Xextern struct bwb_line *bwb_put( struct bwb_line *l );
  1217. Xextern struct bwb_line *bwb_rmdir( struct bwb_line *l );
  1218. Xextern struct bwb_line *bwb_chdir( struct bwb_line *l );
  1219. Xextern struct bwb_line *bwb_mkdir( struct bwb_line *l );
  1220. Xextern struct bwb_line *bwb_kill( struct bwb_line *l );
  1221. Xextern struct bwb_line *bwb_name( struct bwb_line *l );
  1222. Xextern struct bwb_line *bwb_rset( struct bwb_line *l );
  1223. Xextern struct bwb_line *bwb_lset( struct bwb_line *l );
  1224. Xextern struct bwb_line *bwb_field( struct bwb_line *l );
  1225. Xextern struct bwb_line *bwb_on( struct bwb_line *l );
  1226. Xextern struct bwb_line *bwb_line( struct bwb_line *l );
  1227. Xextern struct bwb_line *bwb_ddbl( struct bwb_line *l );
  1228. Xextern struct bwb_line *bwb_dint( struct bwb_line *l );
  1229. Xextern struct bwb_line *bwb_dsng( struct bwb_line *l );
  1230. Xextern struct bwb_line *bwb_dstr( struct bwb_line *l );
  1231. Xextern struct bwb_line *bwb_clear( struct bwb_line *l );
  1232. Xextern struct bwb_line *bwb_erase( struct bwb_line *l );
  1233. Xextern struct bwb_line *bwb_swap( struct bwb_line *l );
  1234. Xextern struct bwb_line *bwb_environ( struct bwb_line *l );
  1235. Xextern struct bwb_line *bwb_width( struct bwb_line *l );
  1236. Xextern struct bwb_line *bwb_write( struct bwb_line *l );
  1237. Xextern struct bwb_line *bwb_edit( struct bwb_line *l );
  1238. Xextern struct bwb_line *bwb_files( struct bwb_line *l );
  1239. Xextern struct bwb_line *bwb_do( struct bwb_line *l );
  1240. Xextern struct bwb_line *bwb_doloop( struct bwb_line *l );
  1241. Xextern struct bwb_line *bwb_cls( struct bwb_line *l );
  1242. Xextern struct bwb_line *bwb_locate( struct bwb_line *l );
  1243. Xextern struct bwb_line *bwb_color( struct bwb_line *l );
  1244. Xextern struct bwb_line *bwb_do( struct bwb_line *l );
  1245. Xextern struct bwb_line *bwb_loop( struct bwb_line *l );
  1246. Xextern struct bwb_line *bwb_exit( struct bwb_line *l );
  1247. Xextern struct bwb_line *bwb_exitfor( struct bwb_line *l );
  1248. Xextern struct bwb_line *bwb_exitdo( struct bwb_line *l );
  1249. X
  1250. Xextern struct bwb_line *bwb_zline( struct bwb_line *l );
  1251. X
  1252. Xextern void bwb_incexec( void );
  1253. Xextern void bwb_decexec( void );
  1254. Xextern int bwb_setexec( struct bwb_line *l, int position, int code );
  1255. Xextern int bwb_getcnd( char *lb, char *lhs, char *rhs, char *op, int *n );
  1256. Xextern int bwb_getlhs( char *lb, char *lhs, int *n );
  1257. Xextern int bwb_getop( char *lb, char *op, int *n );
  1258. Xextern int bwb_getrhs( char *lb, char *rhs, int *n );
  1259. Xextern int bwb_evalcnd( char *lhs, char *rhs, char *op );
  1260. Xextern int bwb_isstr( char *b );
  1261. Xextern int eval_int( int l, int r, char *op );
  1262. Xextern int eval_sng( float l, float r, char *op );
  1263. Xextern int eval_dbl( double l, double r, char *op );
  1264. Xextern struct exp_ese *bwb_exp( char *expression, int assignment, int *position );
  1265. Xextern int exp_getvfname( char *source, char *destination );
  1266. Xextern int exp_operation( int entry_level );
  1267. Xextern int inc_esc( void );
  1268. Xextern int dec_esc( void );
  1269. Xextern int fnc_init( int task );
  1270. Xextern struct bwb_function *fnc_find( char *buffer );
  1271. Xextern struct bwb_line *bwb_def( struct bwb_line *l );
  1272. Xextern int bwb_getargs( char *buffer );
  1273. Xextern int bwb_stripcr( char *s );
  1274. Xextern int bwb_numseq( char *buffer, int *start, int *end );
  1275. Xextern int bwb_freeline( struct bwb_line *l );
  1276. Xextern struct bwb_line *bwb_print( struct bwb_line *l );
  1277. Xextern int bwb_xprint( struct bwb_line *l, FILE *f );
  1278. Xextern int bwb_eltype( char *l_buffer, int p );
  1279. Xextern int var_init( int task );
  1280. Xextern int fslt_init( int task );
  1281. Xextern int var_delcvars( void );
  1282. Xextern struct bwb_variable *var_new( char *name );
  1283. Xextern struct bwb_variable *var_islocal( char *buffer );
  1284. Xextern int bwb_strel( char *lb, char *sb, int *n );
  1285. Xextern struct bwb_variable *bwb_numel( char *lb, int *n );
  1286. Xextern int bwb_const( char *lb, char *sb, int *n );
  1287. Xextern int bwb_getvarname( char *lb, char *sb, int *n );
  1288. Xextern struct bwb_variable *var_find( char *buffer );
  1289. Xextern int bwb_isvar( char *buffer );
  1290. Xextern struct bwb_line *bwb_input( struct bwb_line *l );
  1291. Xextern int inp_adv( char *b, int *c );
  1292. Xextern int var_make( struct bwb_variable *v, int type );
  1293. Xextern bstring *var_getsval( struct bwb_variable *nvar );
  1294. Xextern bstring *var_findsval( struct bwb_variable *v, int *pp );
  1295. Xextern bstring *exp_getsval( struct exp_ese *e );
  1296. Xextern int dim_getparams( char *buffer, int *pos, int *n_params, int **pp );
  1297. Xextern int adv_element( char *buffer, int *pos, char *element );
  1298. Xextern int adv_ws( char *buffer, int *pos );
  1299. X#if MULTISEG_LINES
  1300. Xextern int adv_eos( char *buffer, int *pos );
  1301. X#endif
  1302. Xextern int line_start( char *buffer, int *pos, int *lnpos, int *lnum,
  1303. X   int *cmdpos, int *cmdnum, int *startpos );
  1304. Xextern int is_cmd( char *buffer, int *cmdnum );
  1305. Xextern int is_let( char *buffer, int *cmdnum );
  1306. Xextern int is_eol( char *buffer, int *position );
  1307. Xextern int is_numconst( char *buffer );
  1308. Xextern int is_label( char *buffer );
  1309. Xextern struct bwb_line * find_label( char *buffer );
  1310. Xextern struct bwb_line *find_loop( struct bwb_line *l );
  1311. Xextern int int_qmdstr( char *buffer_a, char *buffer_b );
  1312. Xextern struct bwb_line * cnd_xpline( struct bwb_line *l, char *buffer );
  1313. Xextern int scan_element( char *buffer, int *pos, char *element );
  1314. X
  1315. Xextern int prn_precision( struct bwb_variable *v );
  1316. Xextern int * prn_getcol( FILE *f );
  1317. Xextern int prn_getwidth( FILE *f );
  1318. Xextern int prn_xprintf( FILE *f, char *buffer );
  1319. Xextern int bwb_strtoupper( char *buffer );
  1320. Xextern int getcmdnum( char *cmdstr );
  1321. X
  1322. Xextern int str_btoc( char *buffer, bstring *s );
  1323. Xextern int str_btob( bstring *d, bstring *s );
  1324. Xextern int str_ctob( bstring *s, char *buffer );
  1325. Xextern int str_cmp( bstring *s, bstring *t );
  1326. Xextern char * str_cat( bstring *s, bstring *t );
  1327. Xextern int exp_findop( char *expression );
  1328. Xextern int exp_isop( char *expression );
  1329. Xextern int exp_isfn( char *expression );
  1330. Xextern int exp_isufn( char *expression );
  1331. Xextern int exp_isnc( char *expression );
  1332. Xextern int exp_isvn( char *expression );
  1333. Xextern int exp_iscmd( char *expression );
  1334. Xextern int exp_paren( char *expression );
  1335. Xextern int exp_strconst( char *expression );
  1336. Xextern int exp_numconst( char *expression );
  1337. Xextern int exp_function( char *expression );
  1338. Xextern int exp_ufnc( char *expression );
  1339. Xextern int exp_variable( char *expression );
  1340. Xextern int exp_validarg( char *expression );
  1341. Xextern int ln_asbuf( struct bwb_line *l, char *s );
  1342. Xextern int xputc( FILE *f, char c );
  1343. Xextern int bwx_signon( void );
  1344. Xextern int bwx_message( char *m );
  1345. Xextern int bwx_putc( char c );
  1346. Xextern int bwx_errmes( char *m );
  1347. Xextern int bwx_input( char *prompt, char *buffer );
  1348. Xextern void bwx_terminate( void );
  1349. X
  1350. X#if COMMAND_SHELL
  1351. Xextern int bwx_shell( struct bwb_line *l );
  1352. X#endif
  1353. X
  1354. Xint bwb_scan( void );
  1355. Xstruct bwb_line *bwb_call( struct bwb_line *l );
  1356. Xstruct bwb_line *bwb_sub( struct bwb_line *l );
  1357. Xstruct bwb_line *bwb_endsub( struct bwb_line *l );
  1358. Xstruct bwb_line *bwb_endfnc( struct bwb_line *l );
  1359. Xstruct bwb_line *bwb_function( struct bwb_line *l );
  1360. X
  1361. Xextern bnumber var_getnval( struct bwb_variable *nvar );
  1362. Xextern bnumber *var_findnval( struct bwb_variable *v, int *pp );
  1363. Xextern bnumber exp_getnval( struct exp_ese *e );
  1364. Xextern bnumber *exp_findnval( struct exp_ese *e );
  1365. X
  1366. X#if PARACT
  1367. Xextern int bwb_newtask( int task_requested );
  1368. X#endif
  1369. X
  1370. X#if INTERACTIVE
  1371. Xextern int bwb_interact( void );
  1372. X#endif
  1373. X
  1374. X#if DEBUG
  1375. Xextern int bwb_debug( char *message );
  1376. Xextern struct bwb_line *bwb_cmds( struct bwb_line *l );
  1377. Xextern struct bwb_line *bwb_vars( struct bwb_line *l );
  1378. Xextern struct bwb_line *bwb_fncs( struct bwb_line *l );
  1379. X#endif
  1380. X
  1381. X#ifdef ALLOW_RENUM
  1382. Xextern struct bwb_line *bwb_renum( struct bwb_line *l );
  1383. X#endif
  1384. X
  1385. X#if UNIX_CMDS
  1386. Xextern int rmdir( char *path );
  1387. Xextern int chdir( char *path );
  1388. X#if MKDIR_ONE_ARG
  1389. Xextern int mkdir( char *path );
  1390. X#else
  1391. Xextern int mkdir( char *path, unsigned short permissions );
  1392. X#endif
  1393. X#endif
  1394. X
  1395. X/* declarations of function commands */
  1396. X
  1397. Xextern struct bwb_variable *fnc_null( int argc, struct bwb_variable *argv, int unique_id );
  1398. X#if COMPRESS_FUNCS
  1399. Xextern struct bwb_variable *fnc_core( int argc, struct bwb_variable *argv, int unique_id );
  1400. X#else
  1401. Xextern struct bwb_variable *fnc_abs( int argc, struct bwb_variable *argv, int unique_id );
  1402. Xextern struct bwb_variable *fnc_atn( int argc, struct bwb_variable *argv, int unique_id );
  1403. Xextern struct bwb_variable *fnc_cos( int argc, struct bwb_variable *argv, int unique_id );
  1404. Xextern struct bwb_variable *fnc_log( int argc, struct bwb_variable *argv, int unique_id );
  1405. Xextern struct bwb_variable *fnc_sin( int argc, struct bwb_variable *argv, int unique_id );
  1406. Xextern struct bwb_variable *fnc_sqr( int argc, struct bwb_variable *argv, int unique_id );
  1407. Xextern struct bwb_variable *fnc_sgn( int argc, struct bwb_variable *argv, int unique_id );
  1408. Xextern struct bwb_variable *fnc_int( int argc, struct bwb_variable *argv, int unique_id );
  1409. Xextern struct bwb_variable *fnc_rnd( int argc, struct bwb_variable *argv, int unique_id );
  1410. Xextern struct bwb_variable *fnc_exp( int argc, struct bwb_variable *argv, int unique_id );
  1411. Xextern struct bwb_variable *fnc_tan( int argc, struct bwb_variable *argv, int unique_id );
  1412. X#endif
  1413. Xextern struct bwb_variable *fnc_tab( int argc, struct bwb_variable *argv, int unique_id );
  1414. Xextern struct bwb_variable *fnc_date( int argc, struct bwb_variable *argv, int unique_id );
  1415. Xextern struct bwb_variable *fnc_time( int argc, struct bwb_variable *argv, int unique_id );
  1416. Xextern struct bwb_variable *fnc_chr( int argc, struct bwb_variable *argv, int unique_id );
  1417. Xextern struct bwb_variable *fnc_mid( int argc, struct bwb_variable *argv, int unique_id );
  1418. Xextern struct bwb_variable *fnc_left( int argc, struct bwb_variable *argv, int unique_id );
  1419. Xextern struct bwb_variable *fnc_right( int argc, struct bwb_variable *argv, int unique_id );
  1420. Xextern struct bwb_variable *fnc_timer( int argc, struct bwb_variable *argv, int unique_id );
  1421. Xextern struct bwb_variable *fnc_val( int argc, struct bwb_variable *argv, int unique_id );
  1422. Xextern struct bwb_variable *fnc_len( int argc, struct bwb_variable *argv, int unique_id );
  1423. Xextern struct bwb_variable *fnc_hex( int argc, struct bwb_variable *argv, int unique_id );
  1424. Xextern struct bwb_variable *fnc_oct( int argc, struct bwb_variable *argv, int unique_id );
  1425. Xextern struct bwb_variable *fnc_cint( int argc, struct bwb_variable *argv, int unique_id );
  1426. Xextern struct bwb_variable *fnc_asc( int argc, struct bwb_variable *argv, int unique_id );
  1427. Xextern struct bwb_variable *fnc_mkd( int argc, struct bwb_variable *argv, int unique_id );
  1428. Xextern struct bwb_variable *fnc_mki( int argc, struct bwb_variable *argv, int unique_id );
  1429. Xextern struct bwb_variable *fnc_mks( int argc, struct bwb_variable *argv, int unique_id );
  1430. Xextern struct bwb_variable *fnc_cvi( int argc, struct bwb_variable *argv, int unique_id );
  1431. Xextern struct bwb_variable *fnc_cvd( int argc, struct bwb_variable *argv, int unique_id );
  1432. Xextern struct bwb_variable *fnc_cvs( int argc, struct bwb_variable *argv, int unique_id );
  1433. Xextern struct bwb_variable *fnc_string( int argc, struct bwb_variable *argv, int unique_id );
  1434. Xextern struct bwb_variable * fnc_spc( int argc, struct bwb_variable *argv, int unique_id );
  1435. Xextern struct bwb_variable * fnc_space( int argc, struct bwb_variable *argv, int unique_id );
  1436. Xextern struct bwb_variable * fnc_environ( int argc, struct bwb_variable *argv, int unique_id );
  1437. Xextern struct bwb_variable * fnc_pos( int argc, struct bwb_variable *argv, int unique_id );
  1438. Xextern struct bwb_variable * fnc_err( int argc, struct bwb_variable *argv, int unique_id );
  1439. Xextern struct bwb_variable * fnc_erl( int argc, struct bwb_variable *argv, int unique_id );
  1440. Xextern struct bwb_variable * fnc_loc( int argc, struct bwb_variable *argv, int unique_id );
  1441. Xextern struct bwb_variable * fnc_lof( int argc, struct bwb_variable *argv, int unique_id );
  1442. Xextern struct bwb_variable * fnc_eof( int argc, struct bwb_variable *argv, int unique_id );
  1443. Xextern struct bwb_variable * fnc_csng( int argc, struct bwb_variable *argv, int unique_id );
  1444. Xextern struct bwb_variable * fnc_instr( int argc, struct bwb_variable *argv, int unique_id );
  1445. Xextern struct bwb_variable * fnc_str( int argc, struct bwb_variable *argv, int unique_id );
  1446. Xextern struct bwb_variable * fnc_inkey( int argc, struct bwb_variable *argv, int unique_id );
  1447. X
  1448. Xextern bnumber trnc_int( bnumber x );
  1449. Xextern int fnc_checkargs( int argc, struct bwb_variable *argv,
  1450. X   int min, int max );
  1451. Xextern int ufsc;            /* user function stack counter */
  1452. X
  1453. X#if DEBUG
  1454. Xextern struct bwb_variable *fnc_test( int argc, struct bwb_variable *argv, int unique_id );
  1455. X#endif
  1456. X
  1457. X#else                                   /* ANSI_C */
  1458. X
  1459. Xextern void bwb_init();
  1460. Xextern int bwb_fload();
  1461. Xextern int bwb_ladd();
  1462. Xextern int bwb_findcmd();
  1463. Xextern struct bwb_line *bwb_xtxtline();
  1464. Xextern void bwb_mainloop();
  1465. Xextern void bwb_execline();
  1466. Xextern int bwb_gets();
  1467. Xextern int bwb_error();
  1468. Xextern void break_handler();
  1469. Xextern void break_mes();
  1470. Xextern struct bwb_line *bwb_null();
  1471. Xextern struct bwb_line *bwb_rem();
  1472. Xextern struct bwb_line *bwb_lerror();
  1473. Xextern struct bwb_line *bwb_run();
  1474. Xextern struct bwb_line *bwb_let();
  1475. Xextern struct bwb_line *bwb_load();
  1476. Xextern struct bwb_line *bwb_merge();
  1477. Xextern struct bwb_line *bwb_chain();
  1478. Xextern struct bwb_line *bwb_common();
  1479. Xextern struct bwb_line *bwb_xload();
  1480. Xextern struct bwb_line *bwb_new();
  1481. Xextern struct bwb_line *bwb_save();
  1482. Xextern struct bwb_line *bwb_list();
  1483. Xextern struct bwb_line *bwb_xlist();
  1484. Xextern struct bwb_line *bwb_go();
  1485. Xextern struct bwb_line *bwb_goto();
  1486. Xextern struct bwb_line *bwb_gosub();
  1487. Xextern struct bwb_line *bwb_return();
  1488. Xextern struct bwb_line *bwb_xend();
  1489. Xextern struct bwb_line *bwb_system();
  1490. Xextern struct bwb_line *bwb_tron();
  1491. Xextern struct bwb_line *bwb_troff();
  1492. Xextern struct bwb_line *bwb_randomize();
  1493. Xextern struct bwb_line *bwb_stop();
  1494. Xextern struct bwb_line *bwb_data();
  1495. Xextern struct bwb_line *bwb_read();
  1496. Xextern struct bwb_line *bwb_restore();
  1497. Xextern struct bwb_line *bwb_delete();
  1498. Xextern struct bwb_line *bwb_if();
  1499. Xextern struct bwb_line *bwb_else();
  1500. Xextern struct bwb_line *bwb_elseif();
  1501. Xextern struct bwb_line *bwb_select();
  1502. Xextern struct bwb_line *bwb_case();
  1503. Xextern struct bwb_line *bwb_endselect();
  1504. Xextern struct bwb_line *bwb_endif();
  1505. Xextern struct bwb_line *bwb_while();
  1506. Xextern struct bwb_line *bwb_wend();
  1507. Xextern struct bwb_line *bwb_for();
  1508. Xextern struct bwb_line *bwb_next();
  1509. Xextern struct bwb_line *bwb_dim();
  1510. Xextern struct bwb_line *bwb_option();
  1511. Xextern struct bwb_line *bwb_open();
  1512. Xextern struct bwb_line *bwb_close();
  1513. Xextern struct bwb_line *bwb_get();
  1514. Xextern struct bwb_line *bwb_put();
  1515. Xextern struct bwb_line *bwb_rmdir();
  1516. Xextern struct bwb_line *bwb_chdir();
  1517. Xextern struct bwb_line *bwb_mkdir();
  1518. Xextern struct bwb_line *bwb_kill();
  1519. Xextern struct bwb_line *bwb_name();
  1520. Xextern struct bwb_line *bwb_rset();
  1521. Xextern struct bwb_line *bwb_lset();
  1522. Xextern struct bwb_line *bwb_field();
  1523. Xextern struct bwb_line *bwb_on();
  1524. Xextern struct bwb_line *bwb_line();
  1525. Xextern struct bwb_line *bwb_ddbl();
  1526. Xextern struct bwb_line *bwb_dint();
  1527. Xextern struct bwb_line *bwb_dsng();
  1528. Xextern struct bwb_line *bwb_dstr();
  1529. Xextern struct bwb_line *bwb_clear();
  1530. Xextern struct bwb_line *bwb_erase();
  1531. Xextern struct bwb_line *bwb_swap();
  1532. Xextern struct bwb_line *bwb_environ();
  1533. Xextern struct bwb_line *bwb_width();
  1534. Xextern struct bwb_line *bwb_write();
  1535. Xextern struct bwb_line *bwb_edit();
  1536. Xextern struct bwb_line *bwb_files();
  1537. Xextern struct bwb_line *bwb_do();
  1538. Xextern struct bwb_line *bwb_doloop();
  1539. Xextern struct bwb_line *bwb_cls();
  1540. Xextern struct bwb_line *bwb_locate();
  1541. Xextern struct bwb_line *bwb_color();
  1542. Xextern struct bwb_line *bwb_do();
  1543. Xextern struct bwb_line *bwb_loop();
  1544. Xextern struct bwb_line *bwb_exit();
  1545. Xextern struct bwb_line *bwb_exitfor();
  1546. Xextern struct bwb_line *bwb_exitdo();
  1547. X
  1548. Xextern struct bwb_line *bwb_zline();
  1549. X
  1550. Xextern void bwb_incexec();
  1551. Xextern void bwb_decexec();
  1552. Xextern int bwb_setexec();
  1553. Xextern int bwb_getcnd();
  1554. Xextern int bwb_getlhs();
  1555. Xextern int bwb_getop();
  1556. Xextern int bwb_getrhs();
  1557. Xextern int bwb_evalcnd();
  1558. Xextern int bwb_isstr();
  1559. Xextern int eval_int();
  1560. Xextern int eval_sng();
  1561. Xextern int eval_dbl();
  1562. Xextern struct exp_ese *bwb_exp();
  1563. Xextern int exp_getvfname();
  1564. Xextern int exp_operation();
  1565. Xextern int inc_esc();
  1566. Xextern int dec_esc();
  1567. Xextern int fnc_init();
  1568. Xextern struct bwb_function *fnc_find();
  1569. Xextern struct bwb_line *bwb_def();
  1570. Xextern int bwb_getargs();
  1571. Xextern int bwb_stripcr();
  1572. Xextern int bwb_numseq();
  1573. Xextern int bwb_freeline();
  1574. Xextern struct bwb_line *bwb_print();
  1575. Xextern int bwb_xprint();
  1576. Xextern int bwb_eltype();
  1577. Xextern int var_init();
  1578. Xextern int fslt_init();
  1579. Xextern int var_delcvars();
  1580. Xextern struct bwb_variable *var_new();
  1581. Xextern struct bwb_variable *var_islocal();
  1582. Xextern int bwb_strel();
  1583. Xextern struct bwb_variable *bwb_numel();
  1584. Xextern int bwb_const();
  1585. Xextern int bwb_getvarname();
  1586. Xextern struct bwb_variable *var_find();
  1587. Xextern int bwb_isvar();
  1588. Xextern struct bwb_line *bwb_input();
  1589. Xextern int inp_adv();
  1590. Xextern int var_make();
  1591. Xextern bstring *var_getsval();
  1592. Xextern bstring *var_findsval();
  1593. Xextern bstring *exp_getsval();
  1594. Xextern int dim_getparams();
  1595. Xextern int adv_element();
  1596. Xextern int adv_ws();
  1597. X#if MULTISEG_LINES
  1598. Xextern int adv_eos();
  1599. X#endif
  1600. Xextern int line_start();
  1601. Xextern int is_cmd();
  1602. Xextern int is_let();
  1603. Xextern int is_eol();
  1604. Xextern int is_numconst();
  1605. Xextern int is_label();
  1606. Xextern struct bwb_line * find_label();
  1607. Xextern struct bwb_line *find_loop();
  1608. Xextern int int_qmdstr();
  1609. Xextern struct bwb_line * cnd_xpline();
  1610. Xextern int scan_element();
  1611. X
  1612. Xextern int prn_precision();
  1613. Xextern int * prn_getcol();
  1614. Xextern int prn_getwidth();
  1615. Xextern int prn_xprintf();
  1616. Xextern int bwb_strtoupper();
  1617. Xextern int getcmdnum();
  1618. X
  1619. Xextern int str_btoc();
  1620. Xextern int str_btob();
  1621. Xextern int str_ctob();
  1622. Xextern int str_cmp();
  1623. Xextern char * str_cat();
  1624. Xextern int exp_findop();
  1625. Xextern int exp_isop();
  1626. Xextern int exp_isfn();
  1627. Xextern int exp_isufn();
  1628. Xextern int exp_isnc();
  1629. Xextern int exp_isvn();
  1630. Xextern int exp_iscmd();
  1631. Xextern int exp_paren();
  1632. Xextern int exp_strconst();
  1633. Xextern int exp_numconst();
  1634. Xextern int exp_function();
  1635. Xextern int exp_ufnc();
  1636. Xextern int exp_variable();
  1637. Xextern int exp_validarg();
  1638. Xextern int ln_asbuf();
  1639. Xextern int xputc();
  1640. Xextern int bwx_signon();
  1641. Xextern int bwx_message();
  1642. Xextern int bwx_putc();
  1643. Xextern int bwx_errmes();
  1644. Xextern int bwx_input();
  1645. Xextern void bwx_terminate();
  1646. X
  1647. X#if COMMAND_SHELL
  1648. Xextern int bwx_shell();
  1649. X#endif
  1650. X
  1651. Xint bwb_scan();
  1652. Xstruct bwb_line *bwb_call();
  1653. Xstruct bwb_line *bwb_sub();
  1654. Xstruct bwb_line *bwb_endsub();
  1655. Xstruct bwb_line *bwb_endfnc();
  1656. Xstruct bwb_line *bwb_function();
  1657. X
  1658. Xextern bnumber var_getnval();
  1659. Xextern bnumber *var_findnval();
  1660. Xextern bnumber exp_getnval();
  1661. Xextern bnumber *exp_findnval();
  1662. X
  1663. X#if PARACT
  1664. Xextern int bwb_newtask();
  1665. X#endif
  1666. X
  1667. X#if INTERACTIVE
  1668. Xextern int bwb_interact();
  1669. X#endif
  1670. X
  1671. X#if DEBUG
  1672. Xextern int bwb_debug();
  1673. Xextern struct bwb_line *bwb_cmds();
  1674. Xextern struct bwb_line *bwb_vars();
  1675. Xextern struct bwb_line *bwb_fncs();
  1676. X#endif
  1677. X
  1678. X#ifdef ALLOW_RENUM
  1679. Xextern struct bwb_line *bwb_renum();
  1680. X#endif
  1681. X
  1682. X#if UNIX_CMDS
  1683. Xextern int rmdir();
  1684. Xextern int chdir();
  1685. X#if MKDIR_ONE_ARG
  1686. Xextern int mkdir();
  1687. X#else
  1688. Xextern int mkdir();
  1689. X#endif
  1690. X#endif
  1691. X
  1692. X/* declarations of function commands */
  1693. X
  1694. Xextern struct bwb_variable *fnc_null();
  1695. X#if COMPRESS_FUNCS
  1696. Xextern struct bwb_variable *fnc_core();
  1697. X#else
  1698. Xextern struct bwb_variable *fnc_abs();
  1699. Xextern struct bwb_variable *fnc_atn();
  1700. Xextern struct bwb_variable *fnc_cos();
  1701. Xextern struct bwb_variable *fnc_log();
  1702. Xextern struct bwb_variable *fnc_sin();
  1703. Xextern struct bwb_variable *fnc_sqr();
  1704. Xextern struct bwb_variable *fnc_sgn();
  1705. Xextern struct bwb_variable *fnc_int();
  1706. Xextern struct bwb_variable *fnc_rnd();
  1707. Xextern struct bwb_variable *fnc_exp();
  1708. Xextern struct bwb_variable *fnc_tan();
  1709. X#endif
  1710. Xextern struct bwb_variable *fnc_tab();
  1711. Xextern struct bwb_variable *fnc_date();
  1712. Xextern struct bwb_variable *fnc_time();
  1713. Xextern struct bwb_variable *fnc_chr();
  1714. Xextern struct bwb_variable *fnc_mid();
  1715. Xextern struct bwb_variable *fnc_left();
  1716. Xextern struct bwb_variable *fnc_right();
  1717. Xextern struct bwb_variable *fnc_timer();
  1718. Xextern struct bwb_variable *fnc_val();
  1719. Xextern struct bwb_variable *fnc_len();
  1720. Xextern struct bwb_variable *fnc_hex();
  1721. Xextern struct bwb_variable *fnc_oct();
  1722. Xextern struct bwb_variable *fnc_cint();
  1723. Xextern struct bwb_variable *fnc_asc();
  1724. Xextern struct bwb_variable *fnc_mkd();
  1725. Xextern struct bwb_variable *fnc_mki();
  1726. Xextern struct bwb_variable *fnc_mks();
  1727. Xextern struct bwb_variable *fnc_cvi();
  1728. Xextern struct bwb_variable *fnc_cvd();
  1729. Xextern struct bwb_variable *fnc_cvs();
  1730. Xextern struct bwb_variable *fnc_string();
  1731. Xextern struct bwb_variable * fnc_spc();
  1732. Xextern struct bwb_variable * fnc_space();
  1733. Xextern struct bwb_variable * fnc_environ();
  1734. Xextern struct bwb_variable * fnc_pos();
  1735. Xextern struct bwb_variable * fnc_err();
  1736. Xextern struct bwb_variable * fnc_erl();
  1737. Xextern struct bwb_variable * fnc_loc();
  1738. Xextern struct bwb_variable * fnc_lof();
  1739. Xextern struct bwb_variable * fnc_eof();
  1740. Xextern struct bwb_variable * fnc_csng();
  1741. Xextern struct bwb_variable * fnc_instr();
  1742. Xextern struct bwb_variable * fnc_str();
  1743. Xextern struct bwb_variable * fnc_inkey();
  1744. X
  1745. Xextern bnumber trnc_int();
  1746. Xextern int fnc_checkargs();
  1747. Xextern int ufsc;            /* user function stack counter */
  1748. X
  1749. X#if DEBUG
  1750. Xextern struct bwb_variable *fnc_test();
  1751. X#endif
  1752. X
  1753. X#endif                                  /* ANSI_C */
  1754. X
  1755. X#if COMPRESS_FUNCS
  1756. X#define         F_ABS           1
  1757. X#define         F_ATN           2
  1758. X#define         F_COS           3
  1759. X#define         F_EXP           4
  1760. X#define         F_INT           5
  1761. X#define         F_LOG           6
  1762. X#define         F_RND           7
  1763. X#define         F_SGN           8
  1764. X#define         F_SIN           9
  1765. X#define         F_SQR           10
  1766. X#define         F_TAN           11
  1767. X#endif
  1768. END_OF_FILE
  1769.   if test 54437 -ne `wc -c <'bwbasic-2.10/bwbasic.h'`; then
  1770.     echo shar: \"'bwbasic-2.10/bwbasic.h'\" unpacked with wrong size!
  1771.   fi
  1772.   # end of 'bwbasic-2.10/bwbasic.h'
  1773. fi
  1774. echo shar: End of archive 3 \(of 15\).
  1775. cp /dev/null ark3isdone
  1776. MISSING=""
  1777. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do
  1778.     if test ! -f ark${I}isdone ; then
  1779.     MISSING="${MISSING} ${I}"
  1780.     fi
  1781. done
  1782. if test "${MISSING}" = "" ; then
  1783.     echo You have unpacked all 15 archives.
  1784.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1785. else
  1786.     echo You still must unpack the following archives:
  1787.     echo "        " ${MISSING}
  1788. fi
  1789. exit 0
  1790. exit 0 # Just in case...
  1791.