diff --git a/Makefile.ncu b/Makefile.ncu new file mode 100644 index 0000000..a357a48 --- /dev/null +++ b/Makefile.ncu @@ -0,0 +1,128 @@ +# Generated automatically from Makefile.in by configure. +# Unix Makefile for Bywater BASIC Interpreter + +##---------------------------------------------------------------## +## NOTE: Modifications marked "JBV" were made by Jon B. Volkoff, ## +## 10/1995 (eidetics@cerf.net). ## +##---------------------------------------------------------------## + +srcdir = . +VPATH = . + +CC = cc + +INSTALL = cp +INSTALL_PROGRAM = $(INSTALL) +INSTALL_DATA = $(INSTALL) + +DEFS = -DHAVE_STRING=1 -DHAVE_STDLIB=1 -DHAVE_RAISE=1 -DHAVE_UNISTD=1 + +# Revised by JBV +#CFLAGS = -O +CFLAGS = -g -ansi + +# Revised by JBV +#LDFLAGS = -s + +prefix = /usr/local +exec_prefix = $(prefix) +bindir = $(exec_prefix)/bin + +SHELL = /bin/sh + +#CFILES= bwbasic.c bwb_int.c bwb_tbl.c bwb_cmd.c bwb_prn.c\ +# bwb_exp.c bwb_var.c bwb_inp.c bwb_fnc.c bwb_cnd.c\ +# bwb_ops.c bwb_dio.c bwb_str.c bwb_elx.c bwb_mth.c\ +# bwb_stc.c bwb_par.c bwx_tty.c + +CFILES= bwbasic.c bwb_int.c bwb_tbl.c bwb_cmd.c bwb_prn.c\ + bwb_exp.c bwb_var.c bwb_inp.c bwb_fnc.c bwb_cnd.c\ + bwb_ops.c bwb_dio.c bwb_str.c bwb_elx.c bwb_mth.c\ + bwb_stc.c bwb_par.c bwx_ncu.c + +#OFILES= bwbasic.o bwb_int.o bwb_tbl.o bwb_cmd.o bwb_prn.o\ +# bwb_exp.o bwb_var.o bwb_inp.o bwb_fnc.o bwb_cnd.o\ +# bwb_ops.o bwb_dio.o bwb_str.o bwb_elx.o bwb_mth.o\ +# bwb_stc.o bwb_par.o bwx_tty.o + +OFILES= bwbasic.o bwb_int.o bwb_tbl.o bwb_cmd.o bwb_prn.o\ + bwb_exp.o bwb_var.o bwb_inp.o bwb_fnc.o bwb_cnd.o\ + bwb_ops.o bwb_dio.o bwb_str.o bwb_elx.o bwb_mth.o\ + bwb_stc.o bwb_par.o bwx_ncu.o + +#HFILES= bwbasic.h bwb_mes.h bwx_tty.h +HFILES= bwbasic.h bwb_mes.h bwx_ncu.h + +MISCFILES= COPYING INSTALL Makefile.in README bwbasic.doc\ + bwbasic.mak configure.in configure makefile.qcl\ + bwb_tcc.c bwx_iqc.c bwx_iqc.h bwx_ncu.c bwx_ncu.h + +TESTFILES= \ + abs.bas assign.bas callfunc.bas callsub.bas chain1.bas\ + chain2.bas dataread.bas deffn.bas dim.bas doloop.bas\ + dowhile.bas elseif.bas end.bas err.bas fncallfn.bas\ + fornext.bas function.bas gosub.bas gotolabl.bas ifline.bas\ + index.txt input.bas lof.bas loopuntl.bas main.bas\ + mlifthen.bas on.bas onerr.bas onerrlbl.bas ongosub.bas\ + opentest.bas option.bas putget.bas random.bas selcase.bas\ + snglfunc.bas stop.bas term.bas whilwend.bas width.bas\ + writeinp.bas pascaltr.bas + +DISTFILES= $(CFILES) $(HFILES) $(MISCFILES) + +# Revised by JBV +#all: bwbasic +all: bwbasic renum + +bwbasic: $(OFILES) + $(CC) $(OFILES) -lm -lcurses -o $@ $(LDFLAGS) + +# Added by JBV +renum: + $(CC) renum.c -o renum + +$(OFILES): $(HFILES) + +.c.o: + $(CC) -c $(CPPFLAGS) -I$(srcdir) $(DEFS) $(CFLAGS) $< + +install: all + $(INSTALL_PROGRAM) bwbasic $(bindir)/bwbasic + +uninstall: + rm -f $(bindir)/bwbasic + +Makefile: Makefile.in config.status + $(SHELL) config.status +config.status: configure + $(SHELL) config.status --recheck +configure: configure.in + cd $(srcdir); autoconf + +TAGS: $(CFILES) + etags $(CFILES) + +clean: + rm -f *.o bwbasic core + +mostlyclean: clean + +distclean: clean + rm -f Makefile config.status + +realclean: distclean + rm -f TAGS + +# Version number changed from 2.10 to 2.20 by JBV +dist: $(DISTFILES) + echo bwbasic-2.20 > .fname + rm -rf `cat .fname` + mkdir `cat .fname` + ln $(DISTFILES) `cat .fname` + mkdir `cat .fname`/bwbtest + cd bwbtest; ln $(TESTFILES) ../`cat ../.fname`/bwbtest + tar czhf `cat .fname`.tar.gz `cat .fname` + rm -rf `cat .fname` .fname + +# Prevent GNU make v3 from overflowing arg limit on SysV. +.NOEXPORT: diff --git a/README.patch02 b/README.patch02 new file mode 100644 index 0000000..4a5f86c --- /dev/null +++ b/README.patch02 @@ -0,0 +1,75 @@ + + + README.patch02 file for + + + Bywater BASIC Interpreter/Shell, version 2.20 + --------------------------------------------- + + Copyright (c) 1993, Ted A. Campbell + for bwBASIC version 2.10, 11 October 1993 + + Version 2.20 modifications by Jon B. Volkoff, + 25 November 1995 + + Patch level 1 release by Jon B. Volkoff, + 15 March 1996 + + Patch level 2 release by Jon B. Volkoff, + 11 October 1997 + + +LIST OF PATCHES TO 2.20: + +bwb_cmd.c + Fixed calling stack level logic in RETURN statement to prevent erroneous + "RETURN without GOSUB" messages. + +bwb_cnd.c +bwb_stc.c + + Changed continuation condition for WHILE, ELSEIF, and LOOP UNTIL + to be != FALSE, not == TRUE. More in line with common commercial + BASIC implementations. + +bwb_mth.c + Fixed initialization in VAL function so that old results are not later + returned as values. + +bwb_var.c + Added parenthesis level checking to dim_getparams. Using multi-level + expressions as array subscripts was causing the program to bomb. + +bwx_iqc.c +bwx_tty.c +bwb_mes.h + Added second copyright notice. + +bwb_dio.c +bwb_str.c + Added support for strings longer than 255 characters. + +bwb_prn.c + Disabled tab expansion and print width checks when not printing to a file. + +bwb_inp.c + Fixed LINE INPUT file reads to accommodate strings of length MAXSTRINGSIZE. + +bwx_ncu.h +bwx_ncu.c + New files. Code for UNIX ncurses interface, compliments of L.C. Benschop, + Eindhoven, The Netherlands. + +Makefile.ncu + New files. Sample makefile for ncurses implementation. + +bwbasic.h + Revised defines for MININTSIZE and MAXINTSIZE from 16-bit to 32-bit limits. + Revised define for MAXSTRINGSIZE from 255 to 5000 characters. + Changed string length from unsigned char to unsigned int to support strings + longer than 255 characters. + Added support for new ncurses package. + Revised VERSION define to reflect above changes. + +To implement these patches simply replace the old versions of the above source +files with the new ones and remake bwbasic. diff --git a/bwb_cmd.c b/bwb_cmd.c index 797fb61..0ac97f9 100644 --- a/bwb_cmd.c +++ b/bwb_cmd.c @@ -482,10 +482,28 @@ bwb_return( l ) /* see if old position was "GOSUB" */ +/* JBV 1/20/97 */ +/* if ( CURTASK excs[ CURTASK exsc ].code != EXEC_GOSUB ) { bwb_error( err_retnogosub ); } +*/ + + /*--------------------------------------------------------------*/ + /* Make sure we are at the right stack level! */ + /* If we aren't (which could happen for legit reasons), fix the */ + /* exec stack. */ + /* JBV, 1/20/97 */ + /*--------------------------------------------------------------*/ + while ( CURTASK excs[ CURTASK exsc ].code != EXEC_GOSUB ) + { + bwb_decexec(); + if ( CURTASK excs[ CURTASK exsc ].code == EXEC_NORM ) /* End of the line? */ + { + bwb_error( err_retnogosub ); + } + } /* decrement the EXEC stack counter */ diff --git a/bwb_cnd.c b/bwb_cnd.c index 9d3832e..931ccc2 100644 --- a/bwb_cnd.c +++ b/bwb_cnd.c @@ -551,7 +551,7 @@ bwb_elseif( l ) e = bwb_exp( l->buffer, FALSE, &( l->position ) ); - if ( (int) exp_getnval( e ) == TRUE ) + if ( (int) exp_getnval( e ) != FALSE ) /* Was == TRUE (JBV 10/1996) */ { /* ELSEIF condition is TRUE: proceed to the next line */ @@ -1507,7 +1507,7 @@ bwb_while( l ) e = bwb_exp( l->buffer, FALSE, &( l->position ) ); - if ( (int) exp_getnval( e ) == TRUE ) + if ( (int) exp_getnval( e ) != FALSE ) /* Was == TRUE (JBV 10/1996) */ { bwb_setexec( l, l->position, EXEC_WHILE ); return bwb_zline( l ); diff --git a/bwb_dio.c b/bwb_dio.c index 5da4dce..6dcfc83 100644 --- a/bwb_dio.c +++ b/bwb_dio.c @@ -1339,7 +1339,7 @@ bwb_field( l ) #endif b->sbuffer = dev_table[ dev_number ].buffer + current_pos; - b->length = (unsigned char) length; + b->length = (unsigned int) length; /* Was unsigned char (JBV 9/4/97) */ b->rab = TRUE; current_pos += length; diff --git a/bwb_inp.c b/bwb_inp.c index 20b5919..a8ac9c1 100644 --- a/bwb_inp.c +++ b/bwb_inp.c @@ -1458,7 +1458,8 @@ bwb_line( l ) } else { - fgets( tbuf, MAXSTRINGSIZE, inp_device ); + /* Was MAXSTRINGSIZE (JBV 9/8/97) */ + fgets( tbuf, MAXSTRINGSIZE + 2, inp_device ); } bwb_stripcr( tbuf ); str_ctob( var_findsval( v, v->array_pos ), tbuf ); diff --git a/bwb_mes.h b/bwb_mes.h index f8f5903..0600a0a 100644 --- a/bwb_mes.h +++ b/bwb_mes.h @@ -56,6 +56,7 @@ #if LATIN #define MES_SIGNON "Interpres ad linguam BASIC, versionis" #define MES_COPYRIGHT "Iure proprio scriptoris (c) 1993, Eduardi de Campobello" +#define MES_COPYRIGHT_2 "Iure proprio scriptoris (c) 1995-1997, Jon B. Volkoff" #define MES_LANGUAGE "Cum nuntiis latinis ab ipso E. de C." #define PROMPT "bwBASIC: " #define ERROR_HEADER "ERRANT praecepta in ordine" @@ -95,6 +96,7 @@ #if POL_ENGLISH #define MES_SIGNON "Bywater BASIC Interpreter/Shell, version" #define MES_COPYRIGHT "Copyright (c) 1993, Ted A. Campbell" +#define MES_COPYRIGHT_2 "Copyright (c) 1995-1997, Jon B. Volkoff" #define MES_LANGUAGE "Polite English messages courtesy of t.a.c." #define PROMPT "How may we help you? " #define ERROR_HEADER "Very sorry. There is a problem in line" @@ -134,6 +136,7 @@ #if IMP_ENGLISH #define MES_SIGNON "Bywater BASIC Interpreter/Shell, version" #define MES_COPYRIGHT "Watch it: Copyright (c) 1993, Ted A. Campbell" +#define MES_COPYRIGHT_2 "This means you: Copyright (c) 1995-1997, Jon B. Volkoff" #define MES_LANGUAGE "Impolite English messages courtesy of Oscar the Grouch" #define PROMPT "(*sigh) What now? " #define ERROR_HEADER "YOU SCREWED UP at line" @@ -173,6 +176,7 @@ #if STD_RUSSIAN #define MES_SIGNON "iNTERPRETATOR Bywater BASIC, WERSIQ" #define MES_COPYRIGHT "Copyright (c) 1993, Ted A. Campbell" +#define MES_COPYRIGHT_2 "Copyright (c) 1995-1997, Jon B. Volkoff" #define MES_LANGUAGE "" #define PROMPT "gOTOWO" #define ERROR_HEADER "o{ibka W STROKE" @@ -213,6 +217,7 @@ #if STD_GERMAN #define MES_SIGNON "Bywater BASIC Interpreter/Shell, version" #define MES_COPYRIGHT "Copyright (c) 1993, Ted A. Campbell" +#define MES_COPYRIGHT_2 "Copyright (c) 1995-1997, Jon B. Volkoff" #define MES_LANGUAGE "Ausgegeben auf Deutsch von Joerg Rieger" #define PROMPT "bwBASIC: " #define ERROR_HEADER "Irrtum in Zeile" @@ -254,6 +259,7 @@ #if ESPERANTO #define MES_SIGNON "Bywater BASIC Tradukilo/SXelo, vario" #define MES_COPYRIGHT "Kopirajtita (c) 1993, Ted A. Campbell" +#define MES_COPYRIGHT_2 "Kopirajtita (c) 1995-1997, Jon B. Volkoff" #define MES_LANGUAGE "Esperanta traduko farigxi per Ricxjo Muelisto." #define PROMPT "bwBASIC: " #define ERROR_HEADER "ERARO en vico" @@ -297,6 +303,7 @@ #ifndef MES_SIGNON #define MES_SIGNON "Bywater BASIC Interpreter/Shell, version" #define MES_COPYRIGHT "Copyright (c) 1993, Ted A. Campbell" +#define MES_COPYRIGHT_2 "Copyright (c) 1995-1997, Jon B. Volkoff" #define MES_LANGUAGE " " #define PROMPT "bwBASIC: " #define ERROR_HEADER "ERROR in line" diff --git a/bwb_mth.c b/bwb_mth.c index e3aac97..7da1764 100644 --- a/bwb_mth.c +++ b/bwb_mth.c @@ -1093,9 +1093,8 @@ fnc_val( argc, argv, unique_id ) /* read the value */ str_btoc( tbuf, var_getsval( &( argv[ 0 ] ) )); - if ( strlen( tbuf ) == 0 ) /* JBV */ - *var_findnval( &nvar, nvar.array_pos ) = (bnumber) 0; - else + *var_findnval( &nvar, nvar.array_pos ) = (bnumber) 0; /* JBV 1/97 */ + if ( strlen( tbuf ) != 0 ) /* JBV 1/97 (was == 0 with else) */ #if NUMBER_DOUBLE sscanf( tbuf, "%lf", var_findnval( &nvar, nvar.array_pos ) ); diff --git a/bwb_prn.c b/bwb_prn.c index 5085b0a..d97c56e 100644 --- a/bwb_prn.c +++ b/bwb_prn.c @@ -1030,6 +1030,15 @@ xputc( f, c ) { static int tab_pending = FALSE; + /*--------------------------------------------------------------------*/ + /* Don't expand tabs if not printing to stdout or stderr (JBV 9/4/97) */ + /*--------------------------------------------------------------------*/ + if (( f != stdout ) && ( f != stderr )) + { + xxputc( f, c ); + return TRUE; + } + /* check for pending TAB */ if ( tab_pending == TRUE ) @@ -1092,6 +1101,14 @@ xxputc( f, c ) #endif { + /*--------------------------------------------------------------------*/ + /* Don't check width if not printing to stdout or stderr (JBV 9/4/97) */ + /*--------------------------------------------------------------------*/ + if (( f != stdout ) && ( f != stderr )) + { + return xxxputc( f, c ); + } + /* check to see if width has been exceeded */ if ( * prn_getcol( f ) >= prn_getwidth( f )) diff --git a/bwb_stc.c b/bwb_stc.c index 96c6bed..21f4917 100644 --- a/bwb_stc.c +++ b/bwb_stc.c @@ -1607,7 +1607,7 @@ bwb_loopuntil( l ) e = bwb_exp( l->buffer, FALSE, &( l->position ) ); - if ( (int) exp_getnval( e ) == TRUE ) + if ( (int) exp_getnval( e ) != FALSE ) /* Was == TRUE (JBV 10/1996) */ { CURTASK excs[ CURTASK exsc ].while_line = NULL; r = CURTASK excs[ CURTASK exsc ].wend_line; @@ -1746,7 +1746,8 @@ bwb_exitdo( l ) { #if PROG_ERRORS - sprintf( bwb_ebuf, "in bwb_exitfor(): EXIT DO without DO" ); + /* JBV 1/97 (was "bwb_exitfor") */ + sprintf( bwb_ebuf, "in bwb_exitdo(): EXIT DO without DO" ); bwb_error( bwb_ebuf ); #else bwb_error( err_syntax ); diff --git a/bwb_str.c b/bwb_str.c index 4699b20..434c47b 100644 --- a/bwb_str.c +++ b/bwb_str.c @@ -256,7 +256,8 @@ str_ctob( s, buffer ) /* reassign length */ - s->length = (unsigned char) strlen( buffer ); + /* Was unsigned char (JBV 9/4/97) */ + s->length = (unsigned int) strlen( buffer ); #if INTENSIVE_DEBUG sprintf( bwb_ebuf, "in str_ctob(): exit length <%d> string <%s>", diff --git a/bwb_var.c b/bwb_var.c index eddb92b..914d9e1 100644 --- a/bwb_var.c +++ b/bwb_var.c @@ -1849,6 +1849,7 @@ dim_getparams( buffer, pos, n_params, pp ) int x_pos, s_pos; struct exp_ese *e; char tbuf[ MAXSTRINGSIZE + 1 ]; + int paren_level, quote_level; /* JBV 1/97 */ #if INTENSIVE_DEBUG register int n; #endif @@ -1880,11 +1881,26 @@ dim_getparams( buffer, pos, n_params, pp ) s_pos = 0; tbuf[ 0 ] = '\0'; loop = TRUE; + paren_level = 1; /* JBV 1/97 */ + quote_level = 0; /* JBV 1/97 */ while( loop == TRUE ) { switch( buffer[ *pos ] ) { case ')': /* end of parameter list */ + /*-----------------------------------------------------*/ + /* paren_level and quote_level check added by JBV 1/97 */ + /*-----------------------------------------------------*/ + if ( quote_level == 0 ) --paren_level; + if ( paren_level != 0 || quote_level != 0 ) /* Still not done? */ + { + tbuf[ s_pos ] = buffer[ *pos ]; + ++(*pos); + ++s_pos; + tbuf[ s_pos ] = '\0'; + break; + } + x_pos = 0; if ( tbuf[ 0 ] == '\0' ) { @@ -1909,6 +1925,18 @@ dim_getparams( buffer, pos, n_params, pp ) break; case ',': /* end of a parameter */ + /*-----------------------------------------------------*/ + /* paren_level and quote_level check added by JBV 1/97 */ + /*-----------------------------------------------------*/ + if ( paren_level != 1 || quote_level != 0 ) /* Still not done? */ + { + tbuf[ s_pos ] = buffer[ *pos ]; + ++(*pos); + ++s_pos; + tbuf[ s_pos ] = '\0'; + break; + } + x_pos = 0; if ( tbuf[ 0 ] == '\0' ) { @@ -1935,6 +1963,13 @@ dim_getparams( buffer, pos, n_params, pp ) break; default: + if( buffer[ *pos ] == '(' && quote_level == 0 ) + ++paren_level; /* JBV 1/97 */ + if( buffer[ *pos ] == (char) 34 ) + { + if (quote_level == 0) quote_level = 1; + else quote_level = 0; + } tbuf[ s_pos ] = buffer[ *pos ]; ++(*pos); ++s_pos; diff --git a/bwbasic.h b/bwbasic.h index 84c1002..0167218 100644 --- a/bwbasic.h +++ b/bwbasic.h @@ -41,7 +41,7 @@ /* Version number */ -#define VERSION "2.20 patch level 1" /* Current version number */ +#define VERSION "2.20 patch level 2" /* Current version number */ /*************************************************************** @@ -61,6 +61,7 @@ #define IMP_TTY TRUE /* simple TTY-style interface using stdio */ #define IMP_IQC FALSE /* IBM PC, Microsoft QuickC Compiler */ +#define IMP_NCU FALSE /* Linux, ncurses */ #define ALLOW_RENUM TRUE /* Added by JBV */ #if IMP_TTY @@ -71,6 +72,10 @@ #include "bwx_iqc.h" #endif +#if IMP_NCU +#include "bwx_ncu.h" +#endif + /*************************************************************** bwbasic.h: Part I-B: Define Compiler Implementation @@ -210,7 +215,7 @@ ***************************************************************/ #define DEBUG FALSE /* current debugging */ -#define PROG_ERRORS FALSE /* identify serious programming errors */ +#define PROG_ERRORS TRUE /* identify serious programming errors */ /* and print extensive error messages */ /* This will override messages defined in */ /* bwb_mes.h, and almost all messages will be in English */ @@ -431,7 +436,10 @@ #define MAXLINENO 32766 /* maximum line number */ #define MAXVARNAMESIZE 40 /* maximum size for variable name */ #define MAXFILENAMESIZE 40 /* maximum size for file name */ +#if 0 /* JBV 9/4/97 */ #define MAXSTRINGSIZE 255 /* maximum string length */ +#endif +#define MAXSTRINGSIZE 5000 /* maximum string length */ #define EXECLEVELS 64 /* EXEC stack levels */ #define MAX_GOLINES 12 /* Maximum # of lines for ON...GOTO statements */ #define MAX_FARGS 6 /* maximum # arguments to function */ @@ -441,8 +449,12 @@ #define N_OPERATORS 25 /* number of operators defined */ #define N_ERRORS 25 /* number of errors defined */ #define MAX_PRECEDENCE 20 /* highest (last) level of precedence */ +#if 0 /* JBV 9/96 */ #define MININTSIZE -32767 /* minimum integer size */ #define MAXINTSIZE 32767 /* maximum integer size */ +#endif +#define MININTSIZE -2147483647 /* minimum integer size */ +#define MAXINTSIZE 2147483647 /* maximum integer size */ #define DEF_SUBSCRIPT 11 /* default subscript */ #define DEF_DEVICES 16 /* default number of devices available */ #define DEF_WIDTH 128 /* default width for devices */ @@ -573,7 +585,8 @@ typedef float bnumber; typedef struct bstr { - unsigned char length; /* length of string */ + /* unsigned int was unsigned char (JBV 9/4/97) */ + unsigned int length; /* length of string */ char *sbuffer; /* pointer to string buffer */ int rab; /* is it a random-access buffer? */ #if TEST_BSTRING diff --git a/bwx_iqc.c b/bwx_iqc.c index 15325d2..0c26f11 100644 --- a/bwx_iqc.c +++ b/bwx_iqc.c @@ -133,6 +133,8 @@ bwx_signon( void ) prn_xprintf( stdout, bwb_ebuf ); sprintf( bwb_ebuf, "\r%s\n", MES_COPYRIGHT ); prn_xprintf( stdout, bwb_ebuf ); + sprintf( bwb_ebuf, "\r%s\n", MES_COPYRIGHT_2 ); /* JBV 1/97 */ + prn_xprintf( stdout, bwb_ebuf ); #if PERMANENT_DEBUG sprintf( bwb_ebuf, "\r%s\n", "Debugging Mode" ); prn_xprintf( stdout, bwb_ebuf ); diff --git a/bwx_ncu.c b/bwx_ncu.c new file mode 100644 index 0000000..2b68ef0 --- /dev/null +++ b/bwx_ncu.c @@ -0,0 +1,815 @@ +/*************************************************************** + + bwx_ncu.c Environment-dependent implementation + of Bywater BASIC Interpreter + for Linux (and others?) using Ncurses + library, + + This BWBASIC file hacked together by L.C. Benschop, + Eindhoven, The Netherlands. 1997/01/14 and + 1997/01/15 derived from the iqc version. + (benschop@eb.ele.tue.nl) + + All the shell commands (like FILES) interact badly + with curses. I should replace them with popen/addch + + Copyright (c) 1993, Ted A. Campbell + Bywater Software + + email: tcamp@delphi.com + + Copyright and Permissions Information: + + All U.S. and international rights are claimed by the author, + Ted A. Campbell. + + This software is released under the terms of the GNU General + Public License (GPL), which is distributed with this software + in the file "COPYING". The GPL specifies the terms under + which users may copy and use the software in this distribution. + + A separate license is available for commercial distribution, + for information on which you should contact the author. + +***************************************************************/ + +/*---------------------------------------------------------------*/ +/* NOTE: Modifications marked "JBV" were made by Jon B. Volkoff, */ +/* 11/1995 (eidetics@cerf.net). */ +/* */ +/* Those additionally marked with "DD" were at the suggestion of */ +/* Dale DePriest (daled@cadence.com). */ +/*---------------------------------------------------------------*/ + +#include +#include +#include /* Should be the ncurses version */ +#include +#include +#undef TRUE +#undef FALSE + +/* So curses TRUE and FALSE conflict with the ones defined by bwbasic. + Doesn't this suck big time? + */ + +#include "bwbasic.h" +#include "bwb_mes.h" + +extern int prn_col; +extern jmp_buf mark; +short oldfgd; +long oldbgd; +int reset_mode = FALSE; + +static int ncu_setpos( void ); + +/*************************************************************** + + FUNCTION: main() + + DESCRIPTION: As in any C program, main() is the basic + function from which the rest of the + program is called. Some environments, + however, provide their own main() functions + (Microsoft Windows (tm) is an example). + In these cases, the following code will + have to be included in the initialization + function that is called by the environment. + +***************************************************************/ + + +static int col_arr[]={COLOR_BLACK,COLOR_RED,COLOR_GREEN,COLOR_YELLOW, + COLOR_BLUE,COLOR_MAGENTA,COLOR_CYAN,COLOR_WHITE}; + + +int /* Nobody shall declare main() as void!!!!! (L.C. Benschop)*/ +main( int argc, char **argv ) + { + int i,j; + initscr(); + start_color(); + if(has_colors()) { + /* so there are 63 color pairs, from 1 to 63. Just 1 too few for + all the foreground/background combinations. */ + for(i=0;i<8;i++) + for(j=0;j<8;j++) + if(i||j) init_pair(i*8+j,col_arr[i],col_arr[j]); + } + cbreak(); + nonl(); + noecho(); + scrollok(stdscr,1); + bwb_init( argc, argv ); + +#if INTERACTIVE + setjmp( mark ); +#endif + + while( !feof( stdin ) ) /* condition !feof( stdin ) added in v1.11 */ + { + bwb_mainloop(); + } + } + +/*************************************************************** + + FUNCTION: bwx_signon() + + DESCRIPTION: + +***************************************************************/ + +int +bwx_signon( void ) + { + + sprintf( bwb_ebuf, "\r%s %s\n", MES_SIGNON, VERSION ); + prn_xprintf( stdout, bwb_ebuf ); + sprintf( bwb_ebuf, "\r%s\n", MES_COPYRIGHT ); + prn_xprintf( stdout, bwb_ebuf ); + sprintf( bwb_ebuf, "\r%s\n", MES_COPYRIGHT_2 ); /* JBV 1/97 */ + prn_xprintf( stdout, bwb_ebuf ); +#if PERMANENT_DEBUG + sprintf( bwb_ebuf, "\r%s\n", "Debugging Mode" ); + prn_xprintf( stdout, bwb_ebuf ); +#else + sprintf( bwb_ebuf, "\r%s\n", MES_LANGUAGE ); + prn_xprintf( stdout, bwb_ebuf ); +#endif + + return TRUE; + + } + +/*************************************************************** + + FUNCTION: bwx_message() + + DESCRIPTION: + +***************************************************************/ + +int +bwx_message( char *m ) + { + +#if DEBUG + addstr( "" ); +#endif + + addstr( m ); + refresh(); + return TRUE; + + } + +/*************************************************************** + + FUNCTION: bwx_putc() + + DESCRIPTION: + +***************************************************************/ + +extern int +bwx_putc( char c ) + { + addch(c); + refresh(); + } + +/*************************************************************** + + FUNCTION: bwx_error() + + DESCRIPTION: + +***************************************************************/ + +int +bwx_errmes( char *m ) + { + static char tbuf[ MAXSTRINGSIZE + 1 ]; /* this memory should be + permanent in case of memory + overrun errors */ + + if (( prn_col != 1 ) && ( errfdevice == stderr )) + { + prn_xprintf( errfdevice, "\n" ); + } + if ( CURTASK number == 0 ) + { + sprintf( tbuf, "\n%s: %s\n", ERRD_HEADER, m ); + } + else + { + sprintf( tbuf, "\n%s %d: %s\n", ERROR_HEADER, CURTASK number, m ); + } + +#if INTENSIVE_DEBUG + prn_xprintf( stderr, "" ); +#endif + + prn_xprintf( errfdevice, tbuf ); + + return TRUE; + + } + +/*************************************************************** + + FUNCTION: bwx_input() + + DESCRIPTION: (w)get(n)str seems to interact badly with last line + on screen condition and scrolling. + + +***************************************************************/ + +int +bwx_input( char *prompt, char *buffer ) + { + int y,x,my,mx; +#if INTENSIVE_DEBUG + prn_xprintf( stdout, "" ); +#endif + prn_xprintf( stdout, prompt ); + getyx(stdscr,y,x); + echo(); + wgetnstr(stdscr, buffer, MAXREADLINESIZE); + noecho(); + getmaxyx(stdscr,my,mx); + /* printf("%d %d",my,mx);*/ + if(y+1==my)scroll(stdscr); + /* So this is an extreeeeemely ugly kludge to work around some + bug/feature/wart in ncurses FIXME + I should replace it with getch/addch in a loop */ + + /* prn_xprintf( stdout, "\n" );*/ /* let _outtext catch up */ + + * prn_getcol( stdout ) = 1; /* reset column */ + + return TRUE; + + } + +/*************************************************************** + + FUNCTION: bwx_terminate() + + DESCRIPTION: + +***************************************************************/ + +void +bwx_terminate( void ) + { + nodelay(stdscr,FALSE); + echo(); + nl(); + nocbreak(); + endwin(); + exit( 0 ); + } + +/*************************************************************** + + FUNCTION: bwx_shell() + + DESCRIPTION: + +***************************************************************/ + +#if COMMAND_SHELL +extern int +bwx_shell( struct bwb_line *l ) + { + static char *s_buffer; + static int init = FALSE; + static int position; + + /* get memory for temporary buffer if necessary */ + + if ( init == FALSE ) + { + init = TRUE; + + /* Revised to CALLOC pass-thru call by JBV */ + if ( ( s_buffer = CALLOC( MAXSTRINGSIZE + 1, sizeof( char ),"bwx_shell" )) == NULL ) + { + bwb_error( err_getmem ); + return FALSE; + } + } + + /* get the first element and check for a line number */ + +#if INTENSIVE_DEBUG + sprintf( bwb_ebuf, "in bwx_shell(): line buffer is <%s>.", l->buffer ); + bwb_debug( bwb_ebuf ); +#endif + + position = 0; + adv_element( l->buffer, &position, s_buffer ); + if ( is_numconst( s_buffer ) != TRUE ) /* not a line number */ + { + +#if INTENSIVE_DEBUG + sprintf( bwb_ebuf, "in bwx_shell(): no line number, command <%s>.", + l->buffer ); + bwb_debug( bwb_ebuf ); +#endif + nl(); + endwin(); /* Added by JBV 10/11/97 */ + if ( system( l->buffer ) == 0 ) + { + refresh(); /* Added by JBV 10/11/97 */ + nonl(); + ncu_setpos(); + return TRUE; + } + else + { + refresh(); /* Added by JBV 10/11/97 */ + nonl(); + ncu_setpos(); + return FALSE; + } + } + + else /* advance past line number */ + { + adv_ws( l->buffer, &position ); /* advance past whitespace */ + +#if INTENSIVE_DEBUG + sprintf( bwb_ebuf, "in bwx_shell(): line number, command <%s>.", + l->buffer ); + bwb_debug( bwb_ebuf ); +#endif + nl(); + endwin(); /* Added by JBV 10/11/97 */ + if ( system( &( l->buffer[ position ] ) ) == 0 ) + { + refresh(); /* Added by JBV 10/11/97 */ + nonl(); + ncu_setpos(); + return TRUE; + } + else + { + refresh(); /* Added by JBV 10/11/97 */ + nonl(); + ncu_setpos(); + return FALSE; + } + } + } +#endif + +/*************************************************************** + + FUNCTION: ncu_setpos() + + DESCRIPTION: + +***************************************************************/ + +static int +ncu_setpos( void ) + { + int x,y; + getyx(stdscr,y,x); + move(y,x); + /* and move down one position */ + + prn_xprintf( stdout, "\n" ); + + return TRUE; + } + + +#if COMMON_CMDS + +/*************************************************************** + + FUNCTION: bwb_edit() + + DESCRIPTION: + +***************************************************************/ + +struct bwb_line * +bwb_edit( struct bwb_line *l ) + { + char tbuf[ MAXSTRINGSIZE + 1 ]; + char edname[ MAXSTRINGSIZE + 1 ]; + struct bwb_variable *ed; + FILE *loadfile; + + ed = var_find( DEFVNAME_EDITOR ); + str_btoc( edname, var_getsval( ed )); + + sprintf( tbuf, "%s %s", edname, CURTASK progfile ); + +#if INTENSIVE_DEBUG + sprintf( bwb_ebuf, "in bwb_edit(): command line <%s>", tbuf ); + bwb_debug( bwb_ebuf ); +#else + nl(); + endwin(); /* Added by JBV 10/11/97 */ + system( tbuf ); + + /*-----------------------*/ + /* Added by JBV 10/11/97 */ + /*-----------------------*/ + fprintf( stderr, "Press RETURN when ready..." ); + fgets( tbuf, MAXREADLINESIZE, stdin ); + refresh(); + + nonl(); +#endif + + /* open edited file for read */ + + if ( ( loadfile = fopen( CURTASK progfile, "r" )) == NULL ) + { + sprintf( bwb_ebuf, err_openfile, CURTASK progfile ); + bwb_error( bwb_ebuf ); + + ncu_setpos(); + return bwb_zline( l ); + } + + /* clear current contents */ + + bwb_new( l ); /* Relocated by JBV (bug found by DD) */ + + /* and (re)load the file into memory */ + + bwb_fload( loadfile ); + + + ncu_setpos(); + return bwb_zline( l ); + } + +/*************************************************************** + + FUNCTION: bwb_renum() + + DESCRIPTION: This function implements the BASIC RENUM + command by shelling out to a default + renumbering program called "renum". + Added by JBV 10/95 + + SYNTAX: RENUM + +***************************************************************/ + +#if ANSI_C +struct bwb_line * +bwb_renum( struct bwb_line *l ) +#else +struct bwb_line * +bwb_renum( l ) + struct bwb_line *l; +#endif + { + char tbuf[ MAXSTRINGSIZE + 1 ]; + FILE *loadfile; + + sprintf( tbuf, "renum %s\0", CURTASK progfile ); + +#if INTENSIVE_DEBUG + sprintf( bwb_ebuf, "in bwb_renum(): command line <%s>", tbuf ); + bwb_debug( bwb_ebuf ); +#else + nl(); + endwin(); /* Added by JBV 10/11/97 */ + system( tbuf ); + + /*-----------------------*/ + /* Added by JBV 10/11/97 */ + /*-----------------------*/ + fprintf( stderr, "Press RETURN when ready..." ); + fgets( tbuf, MAXREADLINESIZE, stdin ); + refresh(); + + nonl(); +#endif + + /* open edited file for read */ + + if ( ( loadfile = fopen( CURTASK progfile, "r" )) == NULL ) + { + sprintf( bwb_ebuf, err_openfile, CURTASK progfile ); + bwb_error( bwb_ebuf ); + + ncu_setpos(); + return bwb_zline( l ); + } + + /* clear current contents */ + + bwb_new( l ); /* Relocated by JBV (bug found by DD) */ + + /* and (re)load the file into memory */ + + bwb_fload( loadfile ); + + + ncu_setpos(); + return bwb_zline( l ); + } + +/*************************************************************** + + FUNCTION: bwb_files() + + DESCRIPTION: + +***************************************************************/ + +struct bwb_line * +bwb_files( struct bwb_line *l ) + { + char tbuf[ MAXVARNAMESIZE + 1 ]; + char finame[ MAXVARNAMESIZE + 1 ]; + char argument[ MAXVARNAMESIZE + 1 ]; + struct bwb_variable *fi; + struct exp_ese *e; + + fi = var_find( DEFVNAME_FILES ); + str_btoc( finame, var_getsval( fi )); + + /* get argument */ + + adv_ws( l->buffer, &( l->position )); + switch( l->buffer[ l->position ] ) + { + case '\0': + case '\r': + case '\n': + argument[ 0 ] = '\0'; + break; + default: + e = bwb_exp( l->buffer, FALSE, &( l->position ) ); + if ( e->type != STRING ) + { + bwb_error( err_mismatch ); + return bwb_zline( l ); + } + str_btoc( argument, exp_getsval( e ) ); + break; + } + + + sprintf( tbuf, "%s %s", finame, argument ); + +#if INTENSIVE_DEBUG + sprintf( bwb_ebuf, "in bwb_files(): command line <%s>", tbuf ); + bwb_debug( bwb_ebuf ); +#else + nl(); + endwin(); /* Added by JBV 10/11/97 */ + system( tbuf ); + + /*-----------------------*/ + /* Added by JBV 10/11/97 */ + /*-----------------------*/ + fprintf( stderr, "Press RETURN when ready..." ); + fgets( tbuf, MAXREADLINESIZE, stdin ); + refresh(); + + nonl(); +#endif + + ncu_setpos(); + return bwb_zline( l ); + + } + +#endif /* COMMON_CMDS */ + +#if INTERACTIVE + +/*************************************************************** + + FUNCTION: fnc_inkey() + + DESCRIPTION: This C function implements the BASIC INKEY$ + function. It is implementation-specific. + +***************************************************************/ + +extern struct bwb_variable * +fnc_inkey( int argc, struct bwb_variable *argv,int unique) + { + static struct bwb_variable nvar; + char tbuf[ MAXSTRINGSIZE + 1 ]; + static int init = FALSE; + int c; + + /* initialize the variable if necessary */ + + if ( init == FALSE ) + { + init = TRUE; + var_make( &nvar, STRING); + } + + /* check arguments */ + +#if PROG_ERRORS + if ( argc > 0 ) + { + sprintf( bwb_ebuf, "Two many arguments to function INKEY$()" ); + bwb_error( bwb_ebuf ); + return &nvar; + } + +#else + if ( fnc_checkargs( argc, argv, 0, 0 ) == FALSE ) + { + return NULL; + } +#endif + + /* body of the INKEY$ function */ + + nodelay(stdscr,1); + if ( (c=getch())==EOF ) + { + tbuf[ 0 ] = '\0'; + } + else + { + tbuf[ 0 ] = (char) c; + tbuf[ 1 ] = '\0'; + } + nodelay(stdscr,0); + /* assign value to nvar variable */ + + str_ctob( var_findsval( &nvar, nvar.array_pos ), tbuf ); + + /* return value contained in nvar */ + + return &nvar; + + } + +#endif /* INTERACTIVE */ + +#if MS_CMDS + +/*************************************************************** + + FUNCTION: bwb_cls() + + DESCRIPTION: This C function implements the BASIC CLS + command. It is implementation-specific. + +***************************************************************/ + +extern struct bwb_line * +bwb_cls( struct bwb_line *l ) + { + + clear(); + refresh(); + + return bwb_zline( l ); + } + +/*************************************************************** + + FUNCTION: bwb_locate() + + DESCRIPTION: This C function implements the BASIC LOCATE + command. It is implementation-specific. + +***************************************************************/ + +extern struct bwb_line * +bwb_locate( struct bwb_line *l ) + { + struct exp_ese *e; + int row, column; + + /* get first argument */ + + e = bwb_exp( l->buffer, FALSE, &( l->position )); + row = (int) exp_getnval( e ); + + /* advance past comma */ + + adv_ws( l->buffer, &( l->position )); + if ( l->buffer[ l->position ] != ',' ) + { + bwb_error( err_syntax ); + return bwb_zline( l ); + } + ++( l->position ); + + /* get second argument */ + + e = bwb_exp( l->buffer, FALSE, &( l->position )); + column = (int) exp_getnval( e ); + + /* position the cursor */ + + move( row-1, column-1 ); + + return bwb_zline( l ); + } + +/*************************************************************** + + FUNCTION: bwb_color() + + DESCRIPTION: This C function implements the BASIC COLOR + command. It is implementation-specific. + +***************************************************************/ + + +extern struct bwb_line * +bwb_color( struct bwb_line *l ) + { + struct exp_ese *e; + int fgcolor,bgcolor; + + /* get first argument */ + + e = bwb_exp( l->buffer, FALSE, &( l->position )); + fgcolor = (int) exp_getnval( e ); + +#if INTENSIVE_DEBUG + sprintf( bwb_ebuf, "Setting text color to %d", fgcolor ); + bwb_debug( bwb_ebuf ); +#endif + + +#if INTENSIVE_DEBUG + sprintf( bwb_ebuf, "Set text color to %d", fgcolor ); + bwb_debug( bwb_ebuf ); +#endif + + /* advance past comma */ + + adv_ws( l->buffer, &( l->position )); + if ( l->buffer[ l->position ] == ',' ) + { + + ++( l->position ); + + /* get second argument */ + + e = bwb_exp( l->buffer, FALSE, &( l->position )); + bgcolor = (int) exp_getnval( e ); + +#if INTENSIVE_DEBUG + sprintf( bwb_ebuf, "Setting background color to %d", bgcolor ); + bwb_debug( bwb_ebuf ); +#endif + + /* set the foreground and background color */ + if (has_colors()) { + attrset(A_NORMAL); + bkgdset(COLOR_PAIR((bgcolor&7))|' '); + if((fgcolor&7)==0 && (bgcolor&7)==0){ + /* we didn't reserve a color pair for fg and bg both black. + Bright black(color 8)==dark gray as foreground color A_DIM + A_INVIS doesn't seem to work. wait for next version of + ncurses, don't bother for now.*/ + if(fgcolor<8) attrset(A_INVIS); else attrset(A_DIM); + } else + attrset(COLOR_PAIR((8*(fgcolor&7)+(bgcolor&7))) | + ((fgcolor>7)*A_BOLD)); + /* fg colors 8--15 == extra brightness */ + } else { /* no colors, have a go at it with reverse/bold/dim */ + attrset(A_NORMAL); + bkgdset(A_REVERSE*((fgcolor&7)<(bgcolor&7))|' '); + attrset(A_BOLD*(fgcolor>8)| + A_REVERSE*((fgcolor&7)<(bgcolor&7))|A_INVIS*(fgcolor==bgcolor)); + } + + +#if INTENSIVE_DEBUG + sprintf( bwb_ebuf, "Setting background color to %d\n", bgcolor ); + bwb_debug( bwb_ebuf ); +#endif + + } + + return bwb_zline( l ); + } +#endif /* MS_CMDS */ + + + + + + diff --git a/bwx_ncu.h b/bwx_ncu.h new file mode 100644 index 0000000..58b6453 --- /dev/null +++ b/bwx_ncu.h @@ -0,0 +1,42 @@ +/*************************************************************** + + bwx_ncu.h Header File for Linux (and others?) using Ncurses + library, + + This BWBASIC file hacked together by L.C. Benschop, + Eindhoven, The Netherlands. + (benschop@eb.ele.tue.nl) + + Copyright (c) 1993, Ted A. Campbell + Bywater Software + + email: tcamp@delphi.com + + Copyright and Permissions Information: + + All U.S. and international rights are claimed by the author, + Ted A. Campbell. + + This software is released under the terms of the GNU General + Public License (GPL), which is distributed with this software + in the file "COPYING". The GPL specifies the terms under + which users may copy and use the software in this distribution. + + A separate license is available for commercial distribution, + for information on which you should contact the author. + +***************************************************************/ + +#define IMP_IDSTRING "NCU" /* unique ID string for this implementation */ + +/* Definitions indicating which commands and functions are implemented */ + +#define IMP_FNCINKEY 1 /* 0 if INKEY$ is not implemented, 1 if it is */ +#define IMP_CMDCLS 1 /* 0 if CLS is not implemented, 1 if it is */ +#define IMP_CMDLOC 1 /* 0 if LOCATE is not implemented, 1 if it is */ +#define IMP_CMDCOLOR 1 /* 0 if COLOR is not implemented, 1 if it is */ + +#define UNIX_CMDS TRUE +#define MKDIR_ONE_ARG FALSE /* TRUE if your mkdir has but one argument; + FALSE if it has two */ +#define PERMISSIONS 644 /* permissions to set in Unix-type system */ diff --git a/bwx_tty.c b/bwx_tty.c index 41c6759..658eaec 100644 --- a/bwx_tty.c +++ b/bwx_tty.c @@ -117,6 +117,8 @@ bwx_signon() prn_xprintf( stdout, bwb_ebuf ); sprintf( bwb_ebuf, "\r%s\n", MES_COPYRIGHT ); prn_xprintf( stdout, bwb_ebuf ); + sprintf( bwb_ebuf, "\r%s\n", MES_COPYRIGHT_2 ); /* JBV 1/97 */ + prn_xprintf( stdout, bwb_ebuf ); #if PERMANENT_DEBUG sprintf( bwb_ebuf, "\r%s\n", "Debugging Mode" ); prn_xprintf( stdout, bwb_ebuf );