home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / bwbasic.zip / src / bwbasic.h < prev    next >
C/C++ Source or Header  |  1993-04-27  |  30KB  |  636 lines

  1. /***************************************************************
  2.  
  3.         bwbasic.h       Header File
  4.                         for Bywater BASIC Interpreter
  5.  
  6.                         Copyright (c) 1992, Ted A. Campbell
  7.  
  8.                         Bywater Software
  9.                         P. O. Box 4023
  10.                         Duke Station
  11.                         Durham, NC  27706
  12.  
  13.                         email: tcamp@acpub.duke.edu
  14.  
  15.         Copyright and Permissions Information:
  16.  
  17.         All U.S. and international copyrights are claimed by the
  18.         author. The author grants permission to use this code
  19.         and software based on it under the following conditions:
  20.         (a) in general, the code and software based upon it may be
  21.         used by individuals and by non-profit organizations; (b) it
  22.         may also be utilized by governmental agencies in any country,
  23.         with the exception of military agencies; (c) the code and/or
  24.         software based upon it may not be sold for a profit without
  25.         an explicit and specific permission from the author, except
  26.         that a minimal fee may be charged for media on which it is
  27.         copied, and for copying and handling; (d) the code must be
  28.         distributed in the form in which it has been released by the
  29.         author; and (e) the code and software based upon it may not
  30.         be used for illegal activities.
  31.  
  32. ***************************************************************/
  33.  
  34.  
  35. #ifndef TRUE
  36. #define TRUE    -1
  37. #define FALSE   0
  38. #endif
  39.  
  40. /* Version number */
  41.  
  42. #define VERSION         "1.10"          /* Current version number */
  43.  
  44. /* Definitions controlling program features */
  45.  
  46. #define DIRECTORY_CMDS    TRUE         /* implement CHDIR, MKDIR, and RMDIR */
  47.                     /* requires chdir() mkdir() rmdir() */
  48. #define COMMAND_SHELL   TRUE        /* allow command shell processing */
  49.  
  50. /* definitions controlling debugging options */
  51.  
  52. #define DEBUG           TRUE        /* current debugging */
  53. #define PROG_ERRORS     FALSE        /* identify serious programming errors */
  54.                     /* and print extensive error messages */
  55.                     /* This will override messages defined in */
  56.                     /* bwb_mes.h, and almost all messages will be in English */
  57. #define CHECK_RECURSION FALSE        /* check for recursion violation in expression parser */
  58. #define INTENSIVE_DEBUG FALSE           /* old debugging; might be useful later */
  59. #define REDIRECT_STDERR FALSE           /* Redirect stderr to file ERRFILE */
  60. #define TEST_BSTRING    FALSE        /* test bstring integrity */
  61. #define ERRFILE         "err.out"       /* Filename for redirected error messages */
  62.  
  63. /* define number of commands */
  64.  
  65. #define CMDS_BASE       55              /* number of base commands defined */
  66. #if DIRECTORY_CMDS
  67. #define CMDS_DIR    3
  68. #else
  69. #define CMDS_DIR    0
  70. #endif
  71. #if DEBUG
  72. #define CMDS_DEBUG      3               /* number of debugging cmds */
  73. #else
  74. #define CMDS_DEBUG      0               /* no debugging cmds */
  75. #endif
  76. #define COMMANDS        (CMDS_BASE+CMDS_DEBUG+CMDS_DIR)    /* total number of cmds */
  77.  
  78. #define FUNCS_BASE      43              /* number of basic functions */
  79. #ifdef DEBUG
  80. #define FUNCS_DEBUG    1        /* number of debugging functions */
  81. #else
  82. #define FUNCS_DEBUG    0        /* number of debugging functions */
  83. #endif
  84. #define FUNCTIONS    (FUNCS_BASE+FUNCS_DEBUG)    /* total number of functions implemented */
  85.  
  86. #define MAXARGSIZE      128             /* maximum size of argument */
  87. #define MAXREADLINESIZE 256             /* size of read_line buffer */
  88. #define MAXCMDNAMESIZE  64              /* maximum size for command name */
  89. #define MAXLINENO       32767           /* maximum line number */
  90. #define MAXVARNAMESIZE  40              /* maximum size for variable name */
  91. #define MAXFILENAMESIZE 40              /* maximum size for file name */
  92. #define MAXSTRINGSIZE   255             /* maximum string length */
  93. #define GOSUBLEVELS     36              /* GOSUB stack levels */
  94. #define WHILELEVELS     36              /* WHILE stack levels */
  95. #define FORLEVELS       36              /* FOR stack levels */
  96. #define MAX_GOLINES     12              /* Maximum # of lines for ON...GOTO statements */
  97. #define MAX_FARGS       4               /* maximum # arguments to function */
  98. #define MAX_DIMS    64        /* maximum # of dimensions */
  99. #define ESTACKSIZE      64              /* elements in expression stack */
  100. #define UFNCSTACKSIZE   64              /* elements in user-defined function stack */
  101. #define XLSTACKSIZE     16              /* elements in xline stack */
  102. #define XTXTSTACKSIZE   16              /* elements in eXecute TeXT stack */
  103. #define N_OPERATORS     24              /* number of operators defined */
  104. #define N_ERRORS    23        /* number of errors defined */
  105. #define MAX_PRECEDENCE  19              /* highest (last) level of precedence */
  106. #define MININTSIZE      -32767          /* minimum integer size */
  107. #define MAXINTSIZE       32767          /* maximum integer size */
  108. #define DEF_SUBSCRIPT   11              /* default subscript */
  109. #define DEF_DEVICES     16              /* default number of devices available */
  110. #define DEF_WIDTH    128        /* default width for devices */
  111. #define PRN_TAB        0x02        /* send TAB followed by col number to output device */
  112.  
  113. #if DEBUG
  114. #define PERMANENT_DEBUG TRUE
  115. #else
  116. #define PERMANENT_DEBUG FALSE
  117. #endif
  118.  
  119. /* define variable types based on first character */
  120.  
  121. #define INTEGER         '%'
  122. #define DOUBLE          '#'
  123. #define SINGLE          '!'
  124. #define STRING          '$'
  125.  
  126. /* define mathematical operations */
  127.  
  128. #define MULTIPLY        '*'
  129. #define DIVIDE          '/'
  130. #define ADD             '+'
  131. #define SUBTRACT        '-'
  132. #define ARGUMENT        'A'
  133.  
  134. /* absence of one of these marks denotes a single-precision
  135.    (i.e., float) variable */
  136.  
  137. /* Operations defined */
  138.  
  139. #define OP_ERROR        -255        /* operation error (break out) */
  140. #define OP_NULL         0               /* null: operation not defined yet */
  141. #define NUMBER          1               /* number held as internal variable in uvar */
  142. #define CONST_STRING    2               /* string constant */
  143. #define CONST_NUMERICAL 3               /* numerical constant */
  144. #define FUNCTION        4               /* function header */
  145. #define VARIABLE        5               /* external variable pointed to by xvar */
  146. #define PARENTHESIS     6               /* begin parenthetical expression */
  147. #define OP_ADD          7               /* addition sign '+' */
  148. #define OP_SUBTRACT     8               /* subtraction sign '-' */
  149. #define OP_MULTIPLY     9               /* multiplication sign '*' */
  150. #define OP_DIVIDE       10              /* division sign '/' */
  151. #define OP_MODULUS      11              /* modulus "MOD" */
  152. #define OP_EXPONENT     12              /* exponentiation '^' */
  153. #define OP_INTDIVISION  13              /* integer division sign '\' */
  154. #define OP_NEGATION     14              /* negation '-' ??? */
  155. #define OP_STRJOIN      15              /* string join ';' */
  156. #define OP_STRTAB       16              /* string tab ',' */
  157. #define OP_EQUALS       17              /* either logical equal operator */
  158. #define OP_ASSIGN       18              /* assignment operator */
  159. #define OP_NOTEQUAL     20              /* inequality */
  160. #define OP_LESSTHAN     21              /* less than */
  161. #define OP_GREATERTHAN  22              /* greater than */
  162. #define OP_LTEQ         23              /* less than or equal to */
  163. #define OP_GTEQ         24              /* greater than or equal to */
  164. #define OP_NOT          25              /* negation */
  165. #define OP_AND          26              /* conjunction */
  166. #define OP_OR           27              /* disjunction */
  167. #define OP_XOR          28              /* exclusive or */
  168. #define OP_IMPLIES      29              /* implication */
  169. #define OP_EQUIV        30              /* equivalence */
  170. #define OP_TERMINATE    31              /* terminate expression parsing */
  171.  
  172. /* Device input/output modes */
  173.  
  174. #define DEVMODE_AVAILABLE  -1
  175. #define DEVMODE_CLOSED     0
  176. #define DEVMODE_OUTPUT     1
  177. #define DEVMODE_INPUT      2
  178. #define DEVMODE_APPEND     3
  179. #define DEVMODE_RANDOM     4
  180.  
  181. extern char bwb_progfile[ MAXARGSIZE ];
  182. extern char *bwb_ebuf;
  183. extern int bwb_trace;
  184. extern int bwb_number;            /* current line number */
  185. extern struct bwb_line *bwb_l;        /* current line pointer */
  186. extern int exp_esc;            /* expression stack counter */
  187. extern int dim_base;            /* set by OPTION BASE */
  188.  
  189. /* Typdef structure for strings under Bywater BASIC */
  190.  
  191. struct bstr
  192.    {
  193.    unsigned char length;        /* length of string */
  194.    char *buffer;            /* pointer to string buffer */
  195.    int rab;                /* is it a random-access buffer? */
  196.    #if TEST_BSTRING
  197.    char name[ MAXVARNAMESIZE + 1 ];    /* name for test purposes */
  198.    #endif
  199.    };
  200.  
  201. typedef struct bstr bstring;
  202.  
  203. /* Structure used for all variables under Bywater BASIC */
  204.  
  205. struct bwb_variable
  206.    {
  207.    char name[ MAXVARNAMESIZE + 1 ];    /* name */
  208.    int type;                            /* type, i.e., STRING, DOUBLE,
  209.                                            SINGLE, or INTEGER */
  210.    char *array;                /* pointer to array memory */
  211.    size_t array_units;            /* total number of units of memory */
  212.    int  *array_sizes;            /* pointer to array of <dimensions>
  213.                                            integers, with sizes of each
  214.                                            dimension */
  215.    int *array_pos;                      /* current position in array */
  216.    int dimensions;                      /* number of dimensions,
  217.                                            0 = not an array */
  218.    struct bwb_variable *next;           /* next variable in chain */
  219.    int common;                /* should this variable be common to chained programs? */
  220.    };
  221.  
  222. extern struct bwb_variable var_start, var_end;
  223.  
  224. /* Structure to represent program lines under Bywater BASIC */
  225.  
  226. struct bwb_line
  227.    {
  228.    struct bwb_line *next;               /* pointer to next line in chain */
  229.    int number;                          /* line number */
  230.    char *buffer;            /* buffer to hold the line */
  231.    int position;                        /* current position in line */
  232.    int lnpos;                           /* line number position in buffer */
  233.    int lnum;                            /* line number read from buffer */
  234.    int cmdpos;                          /* command position in buffer */
  235.    int cmdnum;                          /* number of command in command table
  236.                                            read from buffer */
  237.    int startpos;                        /* start of rest of line read from buffer */
  238.    int marked;                          /* has line been checked yet? */
  239.    };
  240.  
  241. extern struct bwb_line bwb_start, bwb_end;
  242. extern struct bwb_line *data_line;      /* current line to read data */
  243.  
  244. /* Structure defining user-defined function in Bywater BASIC:
  245.    note that this structure is appended to an existing bwb_function
  246.    structure (see below) and cannot be used apart from its host
  247.    bwb_function structure. */
  248.  
  249. struct user_fnc
  250.    {
  251.    char user_vns[ MAX_FARGS ][ MAXVARNAMESIZE + 1 ]; /* array of variable names: user_vns[ 0 ] is argv[ 0 ], etc. */
  252.    struct bwb_line *line;        /* line on which the function definition occurs */
  253.    char int_line[ MAXSTRINGSIZE + 1 ];    /* line to be interpreted */
  254.    };
  255.  
  256. /* Structure used for all functions under Bywater BASIC.  Note that
  257.    user-defined functions should have an attached user_fnc structure
  258.    pointed to by the ufnc field; if ufnc is set to NULL, then the
  259.    function is predefined. */
  260.  
  261. struct bwb_function
  262.    {
  263.    char name[ MAXVARNAMESIZE + 1 ];     /* name */
  264.    int type;                            /* type, i.e., STRING, DOUBLE,
  265.                                            SINGLE, or INTEGER */
  266.    int arguments;                       /* number of args passed */
  267.    struct user_fnc *ufnc;               /* pointer to structure for a user-defined function (or NULL) */
  268.    struct bwb_variable * (*vector) ( int argc, struct bwb_variable *argv );  /* vector to function to call */
  269.    struct bwb_function *next;           /* next function in chain */
  270.    };
  271.  
  272. extern struct bwb_function fnc_start, fnc_end;
  273. extern struct bwb_function * fnc_find();
  274.  
  275. extern int data_pos;                    /* position in data_line */
  276.  
  277. /* Structure to represent all command statements under Bywater BASIC */
  278.  
  279. struct bwb_command
  280.    {
  281.    char name[ MAXCMDNAMESIZE + 1 ];
  282.    struct bwb_line * (*vector) (struct bwb_line *);
  283.    int arg_offset;
  284.    };
  285.  
  286. extern struct bwb_command bwb_cmdtable[ COMMANDS ];
  287.  
  288. /* Structure to define device stack for Bywater BASIC */
  289.  
  290. struct dev_element
  291.    {
  292.    int mode;                            /* DEVMODE_ item */
  293.    int width;                /* width for output control */
  294.    int col;                /* current column */
  295.    int reclen;                          /* record length for random access */
  296.    int next_record;            /* next record to read/write */
  297.    int loc;                /* location in file */
  298.    char filename[ MAXFILENAMESIZE + 1 ];/* filename */
  299.    FILE *cfp;                           /* C file pointer for this device */
  300.    char *buffer;            /* pointer to character buffer for random access */
  301.    };
  302.  
  303. extern struct dev_element *dev_table;          /* table of devices */
  304.  
  305. /* Structure to define expression stack elements under Bywater BASIC */
  306.  
  307. struct exp_ese
  308.    {
  309.    int operation;                       /* operation at this level */
  310.    char type;                /* type of operation at this level:
  311.                           STRING, INTEGER, SINGLE, or DOUBLE */
  312.    bstring sval;            /* string */
  313.    int ival;                /* integer value */
  314.    float fval;                /* float value */
  315.    double dval;                /* double value */
  316.    char string[ MAXSTRINGSIZE + 1 ];     /* string for writing */
  317.    struct bwb_variable *xvar;           /* pointer to external variable */
  318.    struct bwb_function *function;       /* pointer to function structure */
  319.    int array_pos[ MAX_DIMS ];        /* array for variable positions */
  320.    int pos_adv;                         /* position advanced in string */
  321.    int rec_pos;                         /* position marker for recursive calls */
  322.    };
  323.  
  324. /* Structure to define user-defined function stack elements */
  325.  
  326. struct ufsel                            /* user function stack element */
  327.    {
  328.    char args[ MAX_FARGS ][ MAXARGSIZE + 1 ];
  329.    char l_buffer[ MAXSTRINGSIZE + 1 ];
  330.    int position;
  331.    };
  332.  
  333. /* Structure to define FOR-NEXT stack elements */
  334.  
  335. struct fse                                           /* FOR stack element */
  336.    {
  337.    struct bwb_line     *nextline;                       /* next line after FOR */
  338.    struct bwb_variable *variable;                       /* variable to be incremented */
  339.    int                 target;                          /* target value */
  340.    int                 step;                            /* step increment */
  341.    int                 position;                        /* position for reset */
  342.    };
  343.  
  344. /* Structure to define GOSUB-RETURN stack elements */
  345.  
  346. struct gsse                                           /* GOSUB stack element */
  347.    {
  348.    int                 position;                        /* position marker */
  349.    };
  350.  
  351. extern FILE *errfdevice;                /* output device for error messages */
  352.  
  353. extern struct exp_ese *exp_es;      /* expression stack */
  354. extern struct ufsel *ufs;                  /* user function stack */
  355. extern struct fse *fs;                  /* FOR stack */
  356. extern struct gsse *bwb_gss;            /* GOSUB stack */
  357.  
  358. extern int bwb_gssc;                    /* GOSUB stack counter */
  359. extern int ufsc;                        /* user function stack counter */
  360. extern int ws_counter;                  /* WHILE stack counter */
  361. extern int fs_counter;                  /* FOR stack counter */
  362. extern int err_line;            /* line in which error occurred */
  363. extern int err_number;            /* number of last error */
  364. extern int err_gosubn;            /* number for error GOSUB */
  365. extern char *err_table[ N_ERRORS ];    /* table of error messages */
  366.  
  367. /* Operator Table */
  368.  
  369. static struct
  370.    {
  371.    char symbol[ 8 ];                    /* BASIC symbol for the operator */
  372.    int operation;                       /* internal code for the operator */
  373.    int precedence;                      /* level of precedence, 0 = highest */
  374.    } exp_ops[ N_OPERATORS ] =
  375.    {
  376.    { "NOT",     OP_NOT,         12 },   /* multiple-character operators */
  377.    { "AND",     OP_AND,         13 },   /* should be tested first because */
  378.    { "OR",      OP_OR,          14 },   /* e.g. a ">=" would be matched */
  379.    { "XOR",     OP_XOR,         15 },   /* as "=" if the single-character */
  380.    { "IMP",     OP_IMPLIES,     16 },   /* operator came first */
  381.    { "EQV",     OP_EQUIV,       17 },
  382.    { "MOD",     OP_MODULUS,     4  },
  383.    { "<>",      OP_NOTEQUAL,    7  },
  384.    { "<=",      OP_LTEQ,        10 },
  385.    { "=<",      OP_LTEQ,        10 },   /* allow either form */
  386.    { ">=",      OP_GTEQ,        11 },
  387.    { "=>",      OP_GTEQ,        11 },   /* allow either form */
  388.    { "<",       OP_LESSTHAN,    8  },
  389.    { ">",       OP_GREATERTHAN, 9  },
  390.    { "^",       OP_EXPONENT,    0  },
  391.    { "*",       OP_MULTIPLY,    2  },
  392.    { "/",       OP_DIVIDE,      2  },
  393.    { "\\",      OP_INTDIVISION, 3  },
  394.    { "+",       OP_ADD,         5  },
  395.    { "-",       OP_SUBTRACT,    5  },
  396.    { "=",       OP_EQUALS,      6  },
  397.    { "=",       OP_ASSIGN,      6  },   /* don't worry: OP_EQUALS will be converted to OP_ASSIGN if necessary */
  398.    { ";",       OP_STRJOIN,     18 },
  399.    { ",",       OP_STRTAB,      19 }
  400.    };
  401.  
  402. /* Prototypes for publicly available functions and data */
  403.  
  404. extern int bwb_fload( FILE *file );
  405. extern int bwb_ladd( char *buffer, int replace );
  406. extern int bwb_findcmd( int argc, int a, struct bwb_line *l );
  407. extern struct bwb_line *bwb_xtxtline( char *buffer );
  408. extern struct bwb_line *bwb_xline( struct bwb_line *l );
  409. extern int bwb_gets( char *buffer );
  410. extern int bwb_error( char *message );
  411. extern void break_handler( void );
  412. extern void break_mes( int x );
  413. extern struct bwb_line *bwb_null( struct bwb_line *l );
  414. extern struct bwb_line *bwb_rem( struct bwb_line *l );
  415. extern struct bwb_line *bwb_lerror( struct bwb_line *l );
  416. extern struct bwb_line *bwb_run( struct bwb_line *l );
  417. extern struct bwb_line *bwb_let( struct bwb_line *l );
  418. extern struct bwb_line *bwb_load( struct bwb_line *l );
  419. extern struct bwb_line *bwb_merge( struct bwb_line *l );
  420. extern struct bwb_line *bwb_chain( struct bwb_line *l );
  421. extern struct bwb_line *bwb_common( struct bwb_line *l );
  422. extern struct bwb_line *bwb_xload( struct bwb_line *l );
  423. extern struct bwb_line *bwb_new( struct bwb_line *l );
  424. extern struct bwb_line *bwb_save( struct bwb_line *l );
  425. extern struct bwb_line *bwb_list( struct bwb_line *l );
  426. extern struct bwb_line *bwb_xlist( struct bwb_line *l, FILE *file );
  427. extern struct bwb_line *bwb_goto( struct bwb_line *l );
  428. extern struct bwb_line *bwb_gosub( struct bwb_line *l );
  429. extern struct bwb_line *bwb_return( struct bwb_line *l );
  430. extern struct bwb_line *bwb_xend( struct bwb_line *l );
  431. extern struct bwb_line *bwb_system( struct bwb_line *l );
  432. extern struct bwb_line *bwb_tron( struct bwb_line *l );
  433. extern struct bwb_line *bwb_troff( struct bwb_line *l );
  434. extern struct bwb_line *bwb_randomize( struct bwb_line *l );
  435. extern struct bwb_line *bwb_stop( struct bwb_line *l );
  436. extern struct bwb_line *bwb_data( struct bwb_line *l );
  437. extern struct bwb_line *bwb_read( struct bwb_line *l );
  438. extern struct bwb_line *bwb_restore( struct bwb_line *l );
  439. extern struct bwb_line *bwb_delete( struct bwb_line *l );
  440. extern struct bwb_line *bwb_if( struct bwb_line *l );
  441. extern struct bwb_line *bwb_while( struct bwb_line *l );
  442. extern struct bwb_line *bwb_wend( struct bwb_line *l );
  443. extern struct bwb_line *bwb_for( struct bwb_line *l );
  444. extern struct bwb_line *bwb_next( struct bwb_line *l );
  445. extern struct bwb_line *bwb_dim( struct bwb_line *l );
  446. extern struct bwb_line *bwb_option( struct bwb_line *l );
  447. extern struct bwb_line *bwb_open( struct bwb_line *l );
  448. extern struct bwb_line *bwb_close( struct bwb_line *l );
  449. extern struct bwb_line *bwb_get( struct bwb_line *l );
  450. extern struct bwb_line *bwb_put( struct bwb_line *l );
  451. extern struct bwb_line *bwb_rmdir( struct bwb_line *l );
  452. extern struct bwb_line *bwb_chdir( struct bwb_line *l );
  453. extern struct bwb_line *bwb_mkdir( struct bwb_line *l );
  454. extern struct bwb_line *bwb_kill( struct bwb_line *l );
  455. extern struct bwb_line *bwb_name( struct bwb_line *l );
  456. extern struct bwb_line *bwb_rset( struct bwb_line *l );
  457. extern struct bwb_line *bwb_lset( struct bwb_line *l );
  458. extern struct bwb_line *bwb_field( struct bwb_line *l );
  459. extern struct bwb_line *bwb_on( struct bwb_line *l );
  460. extern struct bwb_line *bwb_line( struct bwb_line *l );
  461. extern struct bwb_line *bwb_ddbl( struct bwb_line *l );
  462. extern struct bwb_line *bwb_dint( struct bwb_line *l );
  463. extern struct bwb_line *bwb_dsng( struct bwb_line *l );
  464. extern struct bwb_line *bwb_dstr( struct bwb_line *l );
  465. extern struct bwb_line *bwb_clear( struct bwb_line *l );
  466. extern struct bwb_line *bwb_erase( struct bwb_line *l );
  467. extern struct bwb_line *bwb_swap( struct bwb_line *l );
  468. extern struct bwb_line *bwb_environ( struct bwb_line *l );
  469. extern struct bwb_line *bwb_width( struct bwb_line *l );
  470. extern struct bwb_line *bwb_write( struct bwb_line *l );
  471. extern int bwb_getcnd( char *lb, char *lhs, char *rhs, char *op, int *n );
  472. extern int bwb_getlhs( char *lb, char *lhs, int *n );
  473. extern int bwb_getop( char *lb, char *op, int *n );
  474. extern int bwb_getrhs( char *lb, char *rhs, int *n );
  475. extern int bwb_evalcnd( char *lhs, char *rhs, char *op );
  476. extern int bwb_isstr( char *b );
  477. extern int eval_int( int l, int r, char *op );
  478. extern int eval_sng( float l, float r, char *op );
  479. extern int eval_dbl( double l, double r, char *op );
  480. extern struct exp_ese *bwb_exp( char *expression, int assignment, int *position );
  481. extern int exp_getvfname( char *source, char *destination );
  482. extern int exp_operation( int entry_level );
  483. extern int inc_esc( void );
  484. extern int dec_esc( void );
  485. extern int fnc_init( void );
  486. extern struct bwb_function *fnc_find( char *buffer );
  487. extern struct bwb_variable *fnc_intufnc( int argc, struct bwb_variable *argv,
  488.    struct bwb_function *f );
  489. extern struct bwb_line *bwb_deffn( struct bwb_line *l );
  490. extern int bwb_getargs( char *buffer );
  491. extern int bwb_stripcr( char *s );
  492. extern int bwb_numseq( char *buffer, int *start, int *end );
  493. extern int bwb_freeline( struct bwb_line *l );
  494. extern struct bwb_line *bwb_print( struct bwb_line *l );
  495. extern int bwb_xprint( struct bwb_line *l, FILE *f );
  496. extern int bwb_eltype( char *l_buffer, int p );
  497. extern int var_init( void );
  498. extern int var_delcvars( void );
  499. extern int bwb_strel( char *lb, char *sb, int *n );
  500. extern struct bwb_variable *bwb_numel( char *lb, int *n );
  501. extern int bwb_const( char *lb, char *sb, int *n );
  502. extern int bwb_getvarname( char *lb, char *sb, int *n );
  503. extern struct bwb_variable *var_find( char *buffer );
  504. extern int bwb_isvar( char *buffer );
  505. extern struct bwb_line *bwb_input( struct bwb_line *l );
  506. extern int inp_adv( char *b, int *c );
  507. extern double var_getdval( struct bwb_variable *nvar );
  508. extern float var_getfval( struct bwb_variable *nvar );
  509. extern int var_getival( struct bwb_variable *nvar );
  510. extern bstring *var_getsval( struct bwb_variable *nvar );
  511. extern bstring *var_findsval( struct bwb_variable *v, int *pp );
  512. extern int *var_findival( struct bwb_variable *v, int *pp );
  513. extern float *var_findfval( struct bwb_variable *v, int *pp );
  514. extern double *var_finddval( struct bwb_variable *v, int *pp );
  515. extern int var_make( struct bwb_variable *v, int type );
  516. extern int dim_getparams( char *buffer, int *pos, int *n_params, int **pp );
  517. extern double exp_getdval( struct exp_ese *e );
  518. extern float exp_getfval( struct exp_ese *e );
  519. extern int exp_getival( struct exp_ese *e );
  520. extern bstring * exp_getsval( struct exp_ese *e );
  521. extern double * exp_finddval( struct exp_ese *e );
  522. extern float * exp_findfval( struct exp_ese *e );
  523. extern int * exp_findival( struct exp_ese *e );
  524. extern int is_numconst( char *buffer );
  525. extern int adv_element( char *buffer, int *pos, char *element );
  526. extern int adv_ws( char *buffer, int *pos );
  527. extern int line_start( char *buffer, int *pos, int *lnpos, int *lnum,
  528.    int *cmdpos, int *cmdnum, int *startpos );
  529. extern int is_cmd( char *buffer, int *cmdnum );
  530. extern int is_let( char *buffer, int *cmdnum );
  531. extern int int_qmdstr( char *buffer_a, char *buffer_b );
  532. extern struct bwb_line * cnd_xpline( struct bwb_line *l, char *buffer );
  533.  
  534. extern int prn_precision( struct bwb_variable *v );
  535. extern int * prn_getcol( FILE *f );
  536. extern int prn_getwidth( FILE *f );
  537. extern int xprintf( FILE *f, char *buffer );
  538. extern int bwb_strtoupper( char *buffer );
  539. extern int getcmdnum( char *cmdstr );
  540.  
  541. extern struct bwb_variable * fnc_tab( int argc, struct bwb_variable *argv );
  542. extern struct bwb_variable * fnc_spc( int argc, struct bwb_variable *argv );
  543. extern struct bwb_variable * fnc_space( int argc, struct bwb_variable *argv );
  544. extern struct bwb_variable * fnc_environ( int argc, struct bwb_variable *argv );
  545. extern struct bwb_variable * fnc_pos( int argc, struct bwb_variable *argv );
  546. extern struct bwb_variable * fnc_err( int argc, struct bwb_variable *argv );
  547. extern struct bwb_variable * fnc_erl( int argc, struct bwb_variable *argv );
  548. extern struct bwb_variable * fnc_loc( int argc, struct bwb_variable *argv );
  549. extern struct bwb_variable * fnc_lof( int argc, struct bwb_variable *argv );
  550. extern struct bwb_variable * fnc_eof( int argc, struct bwb_variable *argv );
  551. extern struct bwb_variable * fnc_csng( int argc, struct bwb_variable *argv );
  552. extern struct bwb_variable * fnc_exp( int argc, struct bwb_variable *argv );
  553. extern struct bwb_variable * fnc_instr( int argc, struct bwb_variable *argv );
  554. extern struct bwb_variable * fnc_str( int argc, struct bwb_variable *argv );
  555. extern int str_btoc( char *buffer, bstring *s );
  556. extern int str_btob( bstring *d, bstring *s );
  557. extern int str_ctob( bstring *s, char *buffer );
  558. extern int str_cmp( bstring *s, bstring *t );
  559. extern char * str_cat( bstring *s, bstring *t );
  560. extern int exp_findop( char *expression );
  561. extern int exp_isop( char *expression );
  562. extern int exp_isfn( char *expression );
  563. extern int exp_isnc( char *expression );
  564. extern int exp_isvn( char *expression );
  565. extern int exp_iscmd( char *expression );
  566. extern int exp_paren( char *expression );
  567. extern int exp_strconst( char *expression );
  568. extern int exp_numconst( char *expression );
  569. extern int exp_function( char *expression );
  570. extern int exp_variable( char *expression );
  571. extern int exp_validarg( char *expression );
  572. extern int ln_asbuf( struct bwb_line *l, char *s );
  573. extern int xputc( FILE *f, char c );
  574.  
  575. #if DEBUG
  576. extern int bwb_debug( char *message );
  577. extern struct bwb_line *bwb_cmds( struct bwb_line *l );
  578. extern struct bwb_line *bwb_vars( struct bwb_line *l );
  579. extern struct bwb_line *bwb_fncs( struct bwb_line *l );
  580. #endif
  581.  
  582. #ifdef ALLOW_RENUM
  583. extern struct bwb_line *bwb_renum( struct bwb_line *l );
  584. #endif
  585. /*
  586. #if DIRECTORY_CMDS
  587. extern int rmdir( char *path );
  588. extern int chdir( char *path );
  589. extern int mkdir( char *path );
  590. #endif
  591. */
  592. /* declarations of function commands */
  593.  
  594. extern struct bwb_variable *fnc_null( int argc, struct bwb_variable *argv );
  595. extern struct bwb_variable *fnc_abs( int argc, struct bwb_variable *argv );
  596. extern struct bwb_variable *fnc_date( int argc, struct bwb_variable *argv );
  597. extern struct bwb_variable *fnc_time( int argc, struct bwb_variable *argv );
  598. extern struct bwb_variable *fnc_atn( int argc, struct bwb_variable *argv );
  599. extern struct bwb_variable *fnc_cos( int argc, struct bwb_variable *argv );
  600. extern struct bwb_variable *fnc_log( int argc, struct bwb_variable *argv );
  601. extern struct bwb_variable *fnc_sin( int argc, struct bwb_variable *argv );
  602. extern struct bwb_variable *fnc_sqr( int argc, struct bwb_variable *argv );
  603. extern struct bwb_variable *fnc_tan( int argc, struct bwb_variable *argv );
  604. extern struct bwb_variable *fnc_sgn( int argc, struct bwb_variable *argv );
  605. extern struct bwb_variable *fnc_int( int argc, struct bwb_variable *argv );
  606. extern struct bwb_variable *fnc_rnd( int argc, struct bwb_variable *argv );
  607. extern struct bwb_variable *fnc_chr( int argc, struct bwb_variable *argv );
  608. extern struct bwb_variable *fnc_mid( int argc, struct bwb_variable *argv );
  609. extern struct bwb_variable *fnc_left( int argc, struct bwb_variable *argv );
  610. extern struct bwb_variable *fnc_right( int argc, struct bwb_variable *argv );
  611. extern struct bwb_variable *fnc_timer( int argc, struct bwb_variable *argv );
  612. extern struct bwb_variable *fnc_val( int argc, struct bwb_variable *argv );
  613. extern struct bwb_variable *fnc_len( int argc, struct bwb_variable *argv );
  614. extern struct bwb_variable *fnc_hex( int argc, struct bwb_variable *argv );
  615. extern struct bwb_variable *fnc_oct( int argc, struct bwb_variable *argv );
  616. extern struct bwb_variable *fnc_cint( int argc, struct bwb_variable *argv );
  617. extern struct bwb_variable *fnc_asc( int argc, struct bwb_variable *argv );
  618. extern struct bwb_variable *fnc_mkd( int argc, struct bwb_variable *argv );
  619. extern struct bwb_variable *fnc_mki( int argc, struct bwb_variable *argv );
  620. extern struct bwb_variable *fnc_mks( int argc, struct bwb_variable *argv );
  621. extern struct bwb_variable *fnc_cvi( int argc, struct bwb_variable *argv );
  622. extern struct bwb_variable *fnc_cvd( int argc, struct bwb_variable *argv );
  623. extern struct bwb_variable *fnc_cvs( int argc, struct bwb_variable *argv );
  624. extern struct bwb_variable *fnc_string( int argc, struct bwb_variable *argv );
  625. extern double trnc_int( double x );
  626. extern int fnc_checkargs( int argc, struct bwb_variable *argv,
  627.    int min, int max );
  628. extern int ufsc;            /* user function stack counter */
  629.  
  630. #if DEBUG
  631. extern struct bwb_variable *fnc_test( int argc, struct bwb_variable *argv );
  632. #endif
  633.  
  634.  
  635.  
  636.