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

  1. Newsgroups: comp.sources.misc
  2. From: tcamp@delphi.com (Ted A. Campbell)
  3. Subject: v40i061:  bwbasic - Bywater BASIC interpreter version 2.10, Part10/15
  4. Message-ID: <1993Oct29.162718.4011@sparky.sterling.com>
  5. X-Md4-Signature: 62a0430993a3803d456fd9eb4fe70438
  6. Sender: kent@sparky.sterling.com (Kent Landfield)
  7. Organization: Sterling Software
  8. Date: Fri, 29 Oct 1993 16:27:18 GMT
  9. Approved: kent@sparky.sterling.com
  10.  
  11. Submitted-by: tcamp@delphi.com (Ted A. Campbell)
  12. Posting-number: Volume 40, Issue 61
  13. Archive-name: bwbasic/part10
  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_dio.c bwbasic-2.10/bwbtest/callfunc.bas
  22. #   bwbasic-2.10/bwbtest/callsub.bas bwbasic-2.10/bwbtest/deffn.bas
  23. #   bwbasic-2.10/bwbtest/dowhile.bas bwbasic-2.10/bwbtest/elseif.bas
  24. #   bwbasic-2.10/bwbtest/end.bas bwbasic-2.10/bwbtest/fncallfn.bas
  25. #   bwbasic-2.10/bwbtest/fornext.bas bwbasic-2.10/bwbtest/gosub.bas
  26. #   bwbasic-2.10/bwbtest/gotolabl.bas bwbasic-2.10/bwbtest/input.bas
  27. #   bwbasic-2.10/bwbtest/main.bas bwbasic-2.10/bwbtest/on.bas
  28. #   bwbasic-2.10/bwbtest/onerr.bas bwbasic-2.10/bwbtest/onerrlbl.bas
  29. #   bwbasic-2.10/bwbtest/ongosub.bas bwbasic-2.10/bwbtest/opentest.bas
  30. #   bwbasic-2.10/bwbtest/option.bas bwbasic-2.10/bwbtest/pascaltr.bas
  31. #   bwbasic-2.10/bwbtest/putget.bas bwbasic-2.10/bwbtest/random.bas
  32. #   bwbasic-2.10/bwbtest/selcase.bas bwbasic-2.10/bwbtest/snglfunc.bas
  33. #   bwbasic-2.10/bwbtest/stop.bas bwbasic-2.10/bwbtest/term.bas
  34. #   bwbasic-2.10/bwbtest/whilwend.bas bwbasic-2.10/bwbtest/width.bas
  35. #   bwbasic-2.10/configure.in
  36. # Wrapped by kent@sparky on Thu Oct 21 10:47:51 1993
  37. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
  38. echo If this archive is complete, you will see the following message:
  39. echo '          "shar: End of archive 10 (of 15)."'
  40. if test -f 'bwbasic-2.10/bwb_dio.c' -a "${1}" != "-c" ; then 
  41.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwb_dio.c'\"
  42. else
  43.   echo shar: Extracting \"'bwbasic-2.10/bwb_dio.c'\" \(41067 characters\)
  44.   sed "s/^X//" >'bwbasic-2.10/bwb_dio.c' <<'END_OF_FILE'
  45. X/***************************************************************
  46. X
  47. X        bwb_dio.c       Device Input/Output Routines
  48. X                        for Bywater BASIC Interpreter
  49. X
  50. X                        Copyright (c) 1993, Ted A. Campbell
  51. X                        Bywater Software
  52. X
  53. X                        email: tcamp@delphi.com
  54. X
  55. X        Copyright and Permissions Information:
  56. X
  57. X        All U.S. and international rights are claimed by the author,
  58. X        Ted A. Campbell.
  59. X
  60. X    This software is released under the terms of the GNU General
  61. X    Public License (GPL), which is distributed with this software
  62. X    in the file "COPYING".  The GPL specifies the terms under
  63. X    which users may copy and use the software in this distribution.
  64. X
  65. X    A separate license is available for commercial distribution,
  66. X    for information on which you should contact the author.
  67. X
  68. X***************************************************************/
  69. X
  70. X#include <stdio.h>
  71. X
  72. X#include "bwbasic.h"
  73. X#include "bwb_mes.h"
  74. X
  75. X#if HAVE_SYSSTAT
  76. X#include <sys/stat.h>
  77. X#endif
  78. X
  79. X#ifndef SEEK_SET
  80. X#define    SEEK_SET    0
  81. X#endif
  82. X
  83. X#if INTENSIVE_DEBUG
  84. X#define RANDOM_FILLCHAR        'X'
  85. X#else
  86. X#define RANDOM_FILLCHAR        ' '
  87. X#endif
  88. X
  89. X#if COMMON_CMDS
  90. Xstruct dev_element *dev_table;          /* table of devices */
  91. X#endif
  92. X
  93. Xstatic struct bwb_variable *v;
  94. Xstatic int pos;
  95. Xstatic int req_devnumber;
  96. Xstatic int rlen;
  97. Xstatic int mode;
  98. X
  99. X#if ANSI_C
  100. Xstatic struct bwb_line *dio_lrset( struct bwb_line *l, int rset );
  101. Xstatic int dio_flush( int dev_number );
  102. X#else
  103. Xstatic struct bwb_line *dio_lrset();
  104. Xstatic int dio_flush();
  105. X#endif
  106. X
  107. X#if COMMON_CMDS
  108. X
  109. X/***************************************************************
  110. X
  111. X        FUNCTION:       bwb_open()
  112. X
  113. X    DESCRIPTION:    This function implements the BASIC OPEN
  114. X            command to open a stream for device input/output.
  115. X
  116. X        SYNTAX: 1. OPEN "I"|"O"|"R", [#]n, filename [,rlen]
  117. X                2. OPEN filename [FOR INPUT|OUTPUT|APPEND|] AS [#]n [LEN=n]
  118. X
  119. X***************************************************************/
  120. X
  121. X#if ANSI_C
  122. Xstruct bwb_line *
  123. Xbwb_open( struct bwb_line *l )
  124. X#else
  125. Xstruct bwb_line *
  126. Xbwb_open( l )
  127. X   struct bwb_line *l;
  128. X#endif
  129. X   {
  130. X   FILE *fp;
  131. X   struct exp_ese *e;
  132. X   int previous_buffer;
  133. X   char atbuf[ MAXSTRINGSIZE + 1 ];
  134. X   char first[ MAXSTRINGSIZE + 1 ];
  135. X   char devname[ MAXSTRINGSIZE + 1 ];
  136. X
  137. X   /* initialize */
  138. X
  139. X   mode = req_devnumber = rlen = -1;
  140. X   previous_buffer = FALSE;
  141. X
  142. X   /* get the first expression element up to comma or whitespace */
  143. X
  144. X   adv_element( l->buffer, &( l->position ), atbuf );
  145. X
  146. X   /* parse the first expression element */
  147. X
  148. X   pos = 0;
  149. X   e = bwb_exp( atbuf, FALSE, &pos );
  150. X   str_btoc( first, exp_getsval( e ) );
  151. X
  152. X#if INTENSIVE_DEBUG
  153. X   sprintf( bwb_ebuf, "in bwb_open(): first element is <%s>",
  154. X      first );
  155. X   bwb_debug( bwb_ebuf );
  156. X#endif
  157. X
  158. X   /* test for syntactical form: if a comma follows the first element,
  159. X      then the syntax is form 1 (the old CP/M BASIC format); otherwise we
  160. X      presume form 2 */
  161. X
  162. X   adv_ws( l->buffer, &( l->position ) );
  163. X
  164. X   /* Parse syntax Form 1 (OPEN "x",#n, devname...) */
  165. X
  166. X   if ( l->buffer[ l->position ] == ',' )
  167. X      {
  168. X
  169. X      /* parse the next element to get the device number */
  170. X
  171. X      ++( l->position );                        /* advance beyond comma */
  172. X      adv_ws( l->buffer, &( l->position ) );
  173. X      if ( l->buffer[ l->position ] == '#' )
  174. X         {
  175. X         ++( l->position );
  176. X         adv_ws( l->buffer, &( l->position ) );
  177. X         }
  178. X
  179. X      adv_element( l->buffer, &( l->position ), atbuf );
  180. X
  181. X      pos = 0;
  182. X      e = bwb_exp( atbuf, FALSE, &pos );
  183. X      if ( e->type == STRING )
  184. X         {
  185. X#if PROG_ERRORS
  186. X     bwb_error( "String where number was expected for device number" );
  187. X#else
  188. X     bwb_error( err_syntax );
  189. X#endif
  190. X         return bwb_zline( l );
  191. X         }
  192. X      req_devnumber = (int) exp_getnval( e );
  193. X
  194. X#if INTENSIVE_DEBUG
  195. X      sprintf( bwb_ebuf, "in bwb_open(): syntax 1, req dev number is %d",
  196. X         req_devnumber );
  197. X      bwb_debug( bwb_ebuf );
  198. X#endif
  199. X
  200. X      /* parse the next element to get the devname */
  201. X
  202. X      adv_ws( l->buffer, &( l->position ) );    /* advance past whitespace */
  203. X      ++( l->position );                        /* advance past comma */
  204. X      adv_element( l->buffer, &( l->position ), atbuf );
  205. X
  206. X      pos = 0;
  207. X      e = bwb_exp( atbuf, FALSE, &pos );
  208. X      if ( e->type != STRING )
  209. X         {
  210. X#if PROG_ERRORS
  211. X     bwb_error( "in bwb_open(): number where string was expected for devname" );
  212. X#else
  213. X     bwb_error( err_syntax );
  214. X#endif
  215. X         return bwb_zline( l );
  216. X         }
  217. X      str_btoc( devname, exp_getsval( e ) );
  218. X
  219. X#if INTENSIVE_DEBUG
  220. X      sprintf( bwb_ebuf, "in bwb_open(): syntax 1, devname <%s>",
  221. X         devname  );
  222. X      bwb_debug( bwb_ebuf );
  223. X#endif
  224. X
  225. X      /* see if there is another element; if so, parse it to get the
  226. X         record length */
  227. X
  228. X      adv_ws( l->buffer, &( l->position ) );
  229. X      if ( l->buffer[ l->position ] == ',' )
  230. X         {
  231. X
  232. X         ++( l->position );                     /* advance beyond comma */
  233. X         adv_element( l->buffer, &( l->position ), atbuf );
  234. X
  235. X         pos = 0;
  236. X         e = bwb_exp( atbuf, FALSE, &pos );
  237. X         if ( e->type == STRING )
  238. X            {
  239. X#if PROG_ERRORS
  240. X            bwb_error( "String where number was expected for record length" );
  241. X#else
  242. X            bwb_error( err_syntax );
  243. X#endif
  244. X            return bwb_zline( l );
  245. X            }
  246. X         rlen = (int) exp_getnval( e );
  247. X
  248. X#if INTENSIVE_DEBUG
  249. X         sprintf( bwb_ebuf, "in bwb_open(): syntax 1, record length is %d",
  250. X            rlen );
  251. X         bwb_debug( bwb_ebuf );
  252. X#endif
  253. X
  254. X         }
  255. X
  256. X      /* the first letter of the first should indicate the
  257. X         type of file opening requested: test this letter,
  258. X         then parse accordingly */
  259. X
  260. X      /* open file for sequential INPUT */
  261. X
  262. X      if ( ( first[ 0 ] == 'i' ) || ( first[ 0 ] == 'I' ))
  263. X         {
  264. X         mode = DEVMODE_INPUT;
  265. X         }
  266. X
  267. X      /* open file for sequential OUTPUT */
  268. X
  269. X      else if ( ( first[ 0 ] == 'o' ) || ( first[ 0 ] == 'O' ))
  270. X         {
  271. X         mode = DEVMODE_OUTPUT;
  272. X         }
  273. X
  274. X      /* open file for RANDOM access input and output */
  275. X
  276. X      else if ( ( first[ 0 ] == 'r' ) || ( first[ 0 ] == 'R' ))
  277. X         {
  278. X         mode = DEVMODE_RANDOM;
  279. X         }
  280. X
  281. X      /* error: none of the appropriate modes found */
  282. X
  283. X      else
  284. X         {
  285. X#if PROG_ERRORS
  286. X     sprintf( bwb_ebuf, "in bwb_open(): invalid mode" );
  287. X     bwb_error( bwb_ebuf );
  288. X#else
  289. X     bwb_error( err_syntax );
  290. X#endif
  291. X         }
  292. X
  293. X#if INTENSIVE_DEBUG
  294. X      sprintf( bwb_ebuf, "in bwb_open(): syntax 1, mode is %d", mode );
  295. X      bwb_debug( bwb_ebuf );
  296. X#endif
  297. X
  298. X      }
  299. X
  300. X   /* Parse syntax Form 2 (OPEN devname FOR mode AS#n ... ) */
  301. X
  302. X   else
  303. X      {
  304. X
  305. X      /* save the devname from first */
  306. X
  307. X      strcpy( devname, first );
  308. X
  309. X#if INTENSIVE_DEBUG
  310. X      sprintf( bwb_ebuf, "in bwb_open(): syntax 2, devname <%s>",
  311. X         devname );
  312. X      bwb_debug( bwb_ebuf );
  313. X#endif
  314. X
  315. X      /* get the next element */
  316. X
  317. X      adv_element( l->buffer, &( l->position ), atbuf );
  318. X
  319. X      /* check for "FOR mode" statement */
  320. X
  321. X      bwb_strtoupper( atbuf );
  322. X      if ( strcmp( atbuf, "FOR" ) == 0 )
  323. X         {
  324. X         adv_element( l->buffer, &( l->position ), atbuf );
  325. X         bwb_strtoupper( atbuf );
  326. X         if ( strcmp( atbuf, "INPUT" ) == 0 )
  327. X            {
  328. X            mode = DEVMODE_INPUT;
  329. X            }
  330. X         else if ( strcmp( atbuf, "OUTPUT" ) == 0 )
  331. X            {
  332. X            mode = DEVMODE_OUTPUT;
  333. X            }
  334. X         else if ( strcmp( atbuf, "APPEND" ) == 0 )
  335. X            {
  336. X            mode = DEVMODE_RANDOM;
  337. X            }
  338. X         else
  339. X            {
  340. X#if PROG_ERRORS
  341. X            bwb_error( "in bwb_open(): Invalid device i/o mode specified" );
  342. X#else
  343. X            bwb_error( err_syntax );
  344. X#endif
  345. X            return bwb_zline( l );
  346. X            }
  347. X
  348. X         /* get the next element */
  349. X
  350. X         adv_element( l->buffer, &( l->position ), atbuf );
  351. X
  352. X         }
  353. X      else
  354. X         {
  355. X         mode = DEVMODE_RANDOM;
  356. X         }
  357. X
  358. X#if INTENSIVE_DEBUG
  359. X      sprintf( bwb_ebuf, "in bwb_open(): syntax 2, mode is %d", mode );
  360. X      bwb_debug( bwb_ebuf );
  361. X#endif
  362. X
  363. X      /* This leaves us with the next element in the atbuf: it
  364. X         should read "AS" */
  365. X
  366. X      bwb_strtoupper( atbuf );
  367. X      if ( strcmp( atbuf, "AS" ) != 0 )
  368. X         {
  369. X#if PROG_ERRORS
  370. X         bwb_error( "in bwb_open(): expected AS statement" );
  371. X#else
  372. X         bwb_error( err_syntax );
  373. X#endif
  374. X         return bwb_zline( l );
  375. X         }
  376. X
  377. X      /* get the next element */
  378. X
  379. X      adv_ws( l->buffer, &( l->position ) );
  380. X
  381. X      if ( l->buffer[ l->position ] == '#' )
  382. X         {
  383. X         ++( l->position );
  384. X         }
  385. X
  386. X      adv_element( l->buffer, &( l->position ), atbuf );
  387. X
  388. X#if INTENSIVE_DEBUG
  389. X      sprintf( bwb_ebuf, "in bwb_open(): string to parse for req dev number <%s>",
  390. X         atbuf );
  391. X      bwb_debug( bwb_ebuf );
  392. X#endif
  393. X
  394. X      pos = 0;
  395. X      e = bwb_exp( atbuf, FALSE, &pos );
  396. X      if ( e->type == STRING )
  397. X         {
  398. X#if PROG_ERRORS
  399. X         bwb_error( "String where number was expected for record length" );
  400. X#else
  401. X         bwb_error( err_syntax );
  402. X#endif
  403. X         return bwb_zline( l );
  404. X         }
  405. X      req_devnumber = (int) exp_getnval( e );
  406. X
  407. X#if INTENSIVE_DEBUG
  408. X      sprintf( bwb_ebuf, "in bwb_open(): syntax 2, req dev number is %d",
  409. X         req_devnumber );
  410. X      bwb_debug( bwb_ebuf );
  411. X#endif
  412. X
  413. X      /* Check for LEN = n statement */
  414. X
  415. X      adv_element( l->buffer, &( l->position ), atbuf );
  416. X      bwb_strtoupper( atbuf );
  417. X      if ( strncmp( atbuf, "LEN", (size_t) 3 ) == 0 )
  418. X         {
  419. X
  420. X         pos = l->position - strlen( atbuf );
  421. X         while( ( l->buffer[ pos ] != '=' ) && ( l->buffer[ pos ] != '\0' ))
  422. X            {
  423. X            ++pos;
  424. X            }
  425. X         if ( l->buffer[ pos ] == '\0' )
  426. X            {
  427. X#if PROG_ERRORS
  428. X            bwb_error( "Failed to find equals sign after LEN element" );
  429. X#else
  430. X            bwb_error( err_syntax );
  431. X#endif
  432. X            return bwb_zline( l );
  433. X            }
  434. X         ++pos;         /* advance past equal sign */
  435. X
  436. X         e = bwb_exp( l->buffer, FALSE, &pos );
  437. X
  438. X         if ( e->type == STRING )
  439. X            {
  440. X#if PROG_ERRORS
  441. X            bwb_error( "String where number was expected for record length" );
  442. X#else
  443. X            bwb_error( err_syntax );
  444. X#endif
  445. X            return bwb_zline( l );
  446. X            }
  447. X         rlen = (int) exp_getnval( e );
  448. X
  449. X#if INTENSIVE_DEBUG
  450. X         sprintf( bwb_ebuf, "in bwb_open(): syntax 2, record length is %d",
  451. X            rlen );
  452. X         bwb_debug( bwb_ebuf );
  453. X#endif
  454. X
  455. X         }
  456. X
  457. X      }                                 /* end of syntax 2 */
  458. X
  459. X   /* check for valid requested device number */
  460. X
  461. X   if ( ( req_devnumber < 0 ) || ( req_devnumber >= DEF_DEVICES ))
  462. X      {
  463. X#if PROG_ERRORS
  464. X      bwb_error( "in bwb_open(): Requested device number is out of range." );
  465. X#else
  466. X      bwb_error( err_devnum );
  467. X#endif
  468. X      return bwb_zline( l );
  469. X      }
  470. X
  471. X   if ( dev_table[ req_devnumber ].mode == DEVMODE_CLOSED )
  472. X      {
  473. X#if INTENSIVE_DEBUG
  474. X      sprintf( bwb_ebuf, "in bwb_open(): using previously closed file (and buffer)" );
  475. X      bwb_debug( bwb_ebuf );
  476. X#endif
  477. X      previous_buffer = TRUE;
  478. X      }
  479. X
  480. X   if ( ( dev_table[ req_devnumber ].mode != DEVMODE_CLOSED ) &&
  481. X      ( dev_table[ req_devnumber ].mode != DEVMODE_AVAILABLE ) )
  482. X      {
  483. X#if PROG_ERRORS
  484. X      bwb_error( "in bwb_open(): Requested device number is already in use." );
  485. X#else
  486. X      bwb_error( err_devnum );
  487. X#endif
  488. X
  489. X      return bwb_zline( l );
  490. X      }
  491. X
  492. X#if INTENSIVE_DEBUG
  493. X   sprintf( bwb_ebuf, "in bwb_open(): ready to open device <%s> mode <%d>",
  494. X      devname, mode );
  495. X   bwb_debug( bwb_ebuf );
  496. X#endif
  497. X
  498. X   /* attempt to open the file */
  499. X
  500. X   switch( mode )
  501. X      {
  502. X      case DEVMODE_OUTPUT:
  503. X         fp = fopen( devname, "w" );
  504. X         break;
  505. X      case DEVMODE_INPUT:
  506. X         fp = fopen( devname, "r" );
  507. X         break;
  508. X      case DEVMODE_APPEND:
  509. X         fp = fopen( devname, "a" );
  510. X         break;
  511. X      case DEVMODE_RANDOM:
  512. X         fp = fopen( devname, "r+" );
  513. X         if ( fp == NULL )
  514. X            {
  515. X            fp = fopen( devname, "w" );
  516. X            fclose( fp );
  517. X            fp = fopen( devname, "r+" );
  518. X            }
  519. X         break;
  520. X      }
  521. X
  522. X   /* check for valid file opening */
  523. X
  524. X   if ( fp == NULL )
  525. X      {
  526. X#if PROG_ERRORS
  527. X      sprintf( bwb_ebuf, "Failed to open device <%s>", devname );
  528. X      bwb_error( bwb_ebuf );
  529. X#else
  530. X      bwb_error( err_dev );
  531. X#endif
  532. X      return bwb_zline( l );
  533. X      }
  534. X
  535. X   /* assign values to device table */
  536. X
  537. X   dev_table[ req_devnumber ].mode = mode;
  538. X   dev_table[ req_devnumber ].cfp = fp;
  539. X   dev_table[ req_devnumber ].reclen = rlen;
  540. X   dev_table[ req_devnumber ].next_record = 1;
  541. X   dev_table[ req_devnumber ].loc = 0;
  542. X   strcpy( dev_table[ req_devnumber ].filename, devname );
  543. X
  544. X   /* allocate a character buffer for random access */
  545. X
  546. X   if (( mode == DEVMODE_RANDOM ) && ( previous_buffer != TRUE ))
  547. X      {
  548. X      if ( ( dev_table[ req_devnumber ].buffer = calloc( rlen + 1, 1 )) == NULL )
  549. X     {
  550. X#if PROG_ERRORS
  551. X     bwb_error( "in bwb_open(): failed to find memory for device buffer" );
  552. X#else
  553. X     bwb_error( err_getmem );
  554. X#endif
  555. X     return bwb_zline( l );
  556. X     }
  557. X
  558. X      dio_flush( req_devnumber );
  559. X
  560. X#if INTENSIVE_DEBUG
  561. X      sprintf( bwb_ebuf, "in bwb_open(): allocated new random-access buffer" );
  562. X      bwb_debug( bwb_ebuf );
  563. X#endif
  564. X
  565. X      }
  566. X
  567. X#if INTENSIVE_DEBUG
  568. X   sprintf( bwb_ebuf, "in bwb_open(): file is open now; end of function" );
  569. X   bwb_debug( bwb_ebuf );
  570. X#endif
  571. X
  572. X   /* return next line number in sequence */
  573. X
  574. X   return bwb_zline( l );
  575. X   }
  576. X
  577. X/***************************************************************
  578. X
  579. X        FUNCTION:       bwb_close()
  580. X
  581. X    DESCRIPTION:    This function implements the BASIC CLOSE
  582. X            command to close a stream for device input/output.
  583. X
  584. X        SYNTAX:         CLOSE [#]n [,[#]n...]
  585. X
  586. X***************************************************************/
  587. X
  588. X#if ANSI_C
  589. Xstruct bwb_line *
  590. Xbwb_close( struct bwb_line *l )
  591. X#else
  592. Xstruct bwb_line *
  593. Xbwb_close( l )
  594. X   struct bwb_line *l;
  595. X#endif
  596. X   {
  597. X   struct exp_ese *e;
  598. X   char atbuf[ MAXSTRINGSIZE + 1 ];
  599. X
  600. X   /* loop to get device numbers to close */
  601. X
  602. X   do
  603. X      {
  604. X
  605. X      adv_ws( l->buffer, &( l->position ) );
  606. X      if ( l->buffer[ l->position ] =='#' )
  607. X         {
  608. X         ++( l->position );
  609. X         }
  610. X
  611. X      adv_element( l->buffer, &( l->position ), atbuf );
  612. X
  613. X      pos = 0;
  614. X      e = bwb_exp( atbuf, FALSE, &pos );
  615. X
  616. X      if ( e->type == STRING )
  617. X         {
  618. X#if PROG_ERRORS
  619. X         bwb_error( "String where number was expected for device number" );
  620. X#else
  621. X         bwb_error( err_syntax );
  622. X#endif
  623. X         return bwb_zline( l );
  624. X         }
  625. X
  626. X      req_devnumber = (int) exp_getnval( e );
  627. X
  628. X#if INTENSIVE_DEBUG
  629. X      sprintf( bwb_ebuf, "in bwb_close(): requested device number <%d>",
  630. X         req_devnumber );
  631. X      bwb_debug( bwb_ebuf );
  632. X#endif
  633. X
  634. X      /* check for valid requested device number */
  635. X
  636. X      if ( ( req_devnumber < 0 ) || ( req_devnumber >= DEF_DEVICES ))
  637. X         {
  638. X#if PROG_ERRORS
  639. X         bwb_error( "in bwb_close(): Requested device number is out if range." );
  640. X#else
  641. X         bwb_error( err_devnum );
  642. X#endif
  643. X         return bwb_zline( l );
  644. X         }
  645. X
  646. X      if (( dev_table[ req_devnumber ].mode == DEVMODE_CLOSED ) ||
  647. X         ( dev_table[ req_devnumber ].mode == DEVMODE_AVAILABLE ) )
  648. X         {
  649. X#if PROG_ERRORS
  650. X         bwb_error( "in bwb_close(): Requested device number is not in use." );
  651. X#else
  652. X         bwb_error( err_devnum );
  653. X#endif
  654. X
  655. X         return bwb_zline( l );
  656. X         }
  657. X
  658. X#if INTENSIVE_DEBUG
  659. X      sprintf( bwb_ebuf, "in bwb_close(): closing device# <%d>",
  660. X     req_devnumber );
  661. X      bwb_debug( bwb_ebuf );
  662. X#endif
  663. X
  664. X      /* attempt to close the file */
  665. X
  666. X      if ( fclose( dev_table[ req_devnumber ].cfp ) != 0 )
  667. X         {
  668. X#if PROG_ERRORS
  669. X         bwb_error( "in bwb_close(): Failed to close the device" );
  670. X#else
  671. X         bwb_error( err_dev );
  672. X#endif
  673. X         return bwb_zline( l );
  674. X         }
  675. X
  676. X      /* mark the device in the table as unavailable */
  677. X
  678. X      dev_table[ req_devnumber ].mode = DEVMODE_CLOSED;
  679. X
  680. X      /* eat up any remaining whitespace */
  681. X
  682. X      adv_ws( l->buffer, &( l->position ) );
  683. X
  684. X      }
  685. X
  686. X   while ( l->buffer[ l->position ] == ',' );
  687. X
  688. X   /* return next line number in sequence */
  689. X
  690. X   return bwb_zline( l );
  691. X   }
  692. X
  693. X#endif                 /* COMMON_CMDS */
  694. X
  695. X/***************************************************************
  696. X
  697. X        FUNCTION:       bwb_chdir()
  698. X
  699. X    DESCRIPTION:    This function implements the BASIC CHDIR
  700. X            command to switch logged directories.
  701. X
  702. X    SYNTAX:         CHDIR pathname$
  703. X
  704. X***************************************************************/
  705. X
  706. X#if UNIX_CMDS
  707. X#if ANSI_C
  708. Xstruct bwb_line *
  709. Xbwb_chdir( struct bwb_line *l )
  710. X#else
  711. Xstruct bwb_line *
  712. Xbwb_chdir( l )
  713. X   struct bwb_line *l;
  714. X#endif
  715. X   {
  716. X   int r;
  717. X   static int position;
  718. X   struct exp_ese *e;
  719. X   static char *atbuf;
  720. X   static int init = FALSE;
  721. X
  722. X   /* get memory for temporary buffers if necessary */
  723. X
  724. X   if ( init == FALSE )
  725. X      {
  726. X      init = TRUE;
  727. X      if ( ( atbuf = calloc( MAXSTRINGSIZE + 1, sizeof( char ) )) == NULL )
  728. X         {
  729. X#if PROG_ERRORS
  730. X     bwb_error( "in bwb_chdir(): failed to find memory for atbuf" );
  731. X#else
  732. X     bwb_error( err_getmem );
  733. X#endif
  734. X     }
  735. X      }
  736. X
  737. X   /* get the next element in atbuf */
  738. X
  739. X   adv_element( l->buffer, &( l->position ), atbuf  );
  740. X
  741. X#if INTENSIVE_DEBUG
  742. X   sprintf( bwb_ebuf, "in bwb_chdir(): argument is <%s>", atbuf );
  743. X   bwb_debug( bwb_ebuf );
  744. X#endif
  745. X
  746. X   /* interpret the argument */
  747. X
  748. X   position = 0;
  749. X   e = bwb_exp( atbuf, FALSE, &position );
  750. X
  751. X   if ( e->type != STRING )
  752. X      {
  753. X      bwb_error( err_argstr );
  754. X      return bwb_zline( l );
  755. X      }
  756. X
  757. X   /* try to chdir to the requested directory */
  758. X
  759. X   str_btoc( atbuf, &( e->sval ) );
  760. X   r = chdir( atbuf );
  761. X
  762. X   /* detect error */
  763. X
  764. X   if ( r == -1 )
  765. X      {
  766. X      bwb_error( err_opsys );
  767. X      return bwb_zline( l );
  768. X      }
  769. X
  770. X   return bwb_zline( l );
  771. X
  772. X   }
  773. X
  774. X/***************************************************************
  775. X
  776. X        FUNCTION:       bwb_rmdir()
  777. X
  778. X    DESCRIPTION:    This function implements the BASIC CHDIR
  779. X            command to remove a subdirectory.
  780. X
  781. X    SYNTAX:         RMDIR pathname$
  782. X
  783. X***************************************************************/
  784. X
  785. X#if ANSI_C
  786. Xstruct bwb_line *
  787. Xbwb_rmdir( struct bwb_line *l )
  788. X#else
  789. Xstruct bwb_line *
  790. Xbwb_rmdir( l )
  791. X   struct bwb_line *l;
  792. X#endif
  793. X   {
  794. X   int r;
  795. X   static int position;
  796. X   struct exp_ese *e;
  797. X   static char *atbuf;
  798. X   static int init = FALSE;
  799. X
  800. X   /* get memory for temporary buffers if necessary */
  801. X
  802. X   if ( init == FALSE )
  803. X      {
  804. X      init = TRUE;
  805. X      if ( ( atbuf = calloc( MAXSTRINGSIZE + 1, sizeof( char ) )) == NULL )
  806. X         {
  807. X#if PROG_ERRORS
  808. X     bwb_error( "in rmdir(): failed to find memory for atbuf" );
  809. X#else
  810. X     bwb_error( err_getmem );
  811. X#endif
  812. X     }
  813. X      }
  814. X
  815. X   /* get the next element in atbuf */
  816. X
  817. X   adv_element( l->buffer, &( l->position ), atbuf  );
  818. X
  819. X#if INTENSIVE_DEBUG
  820. X   sprintf( bwb_ebuf, "in bwb_rmdir(): argument is <%s>", atbuf );
  821. X   bwb_debug( bwb_ebuf );
  822. X#endif
  823. X
  824. X   /* interpret the argument */
  825. X
  826. X   position = 0;
  827. X   e = bwb_exp( atbuf, FALSE, &position );
  828. X
  829. X   if ( e->type != STRING )
  830. X      {
  831. X      bwb_error( err_argstr );
  832. X      return bwb_zline( l );
  833. X      }
  834. X
  835. X   /* try to remove the requested directory */
  836. X
  837. X   str_btoc( atbuf, &( e->sval ) );
  838. X   r = rmdir( atbuf );
  839. X
  840. X   /* detect error */
  841. X
  842. X   if ( r == -1 )
  843. X      {
  844. X      bwb_error( err_opsys );
  845. X      }
  846. X
  847. X   return bwb_zline( l );
  848. X
  849. X   }
  850. X
  851. X/***************************************************************
  852. X
  853. X        FUNCTION:       bwb_mkdir()
  854. X
  855. X    DESCRIPTION:    This function implements the BASIC MKDIR
  856. X            command to create a new subdirectory.
  857. X
  858. X    SYNTAX:         MKDIR pathname$
  859. X
  860. X***************************************************************/
  861. X
  862. X#if ANSI_C
  863. Xstruct bwb_line *
  864. Xbwb_mkdir( struct bwb_line *l )
  865. X#else
  866. Xstruct bwb_line *
  867. Xbwb_mkdir( l )
  868. X   struct bwb_line *l;
  869. X#endif
  870. X   {
  871. X   int r;
  872. X   static int position;
  873. X   struct exp_ese *e;
  874. X   static char *atbuf;
  875. X   static int init = FALSE;
  876. X
  877. X   /* get memory for temporary buffers if necessary */
  878. X
  879. X   if ( init == FALSE )
  880. X      {
  881. X      init = TRUE;
  882. X      if ( ( atbuf = calloc( MAXSTRINGSIZE + 1, sizeof( char ) )) == NULL )
  883. X         {
  884. X#if PROG_ERRORS
  885. X     bwb_error( "in bwb_mkdir(): failed to find memory for atbuf" );
  886. X#else
  887. X     bwb_error( err_getmem );
  888. X#endif
  889. X     }
  890. X      }
  891. X
  892. X   /* get the next element in atbuf */
  893. X
  894. X   adv_element( l->buffer, &( l->position ), atbuf  );
  895. X
  896. X#if INTENSIVE_DEBUG
  897. X   sprintf( bwb_ebuf, "in bwb_mkdir(): argument is <%s>", atbuf );
  898. X   bwb_debug( bwb_ebuf );
  899. X#endif
  900. X
  901. X   /* interpret the argument */
  902. X
  903. X   position = 0;
  904. X   e = bwb_exp( atbuf, FALSE, &position );
  905. X
  906. X   if ( e->type != STRING )
  907. X      {
  908. X      bwb_error( err_argstr );
  909. X      return bwb_zline( l );
  910. X      }
  911. X
  912. X   /* try to make the requested directory */
  913. X
  914. X   str_btoc( atbuf, &( e->sval ) );
  915. X#if MKDIR_ONE_ARG
  916. X   r = mkdir( atbuf );
  917. X#else
  918. X   r = mkdir( atbuf, PERMISSIONS );
  919. X#endif
  920. X
  921. X   /* detect error */
  922. X
  923. X   if ( r == -1 )
  924. X      {
  925. X      bwb_error( err_opsys );
  926. X      }
  927. X
  928. X   return bwb_zline( l );
  929. X
  930. X   }
  931. X
  932. X/***************************************************************
  933. X
  934. X        FUNCTION:       bwb_kill()
  935. X
  936. X    DESCRIPTION:    This function implements the BASIC KILL
  937. X            command to erase a disk file.
  938. X
  939. X    SYNTAX:         KILL filename
  940. X
  941. X***************************************************************/
  942. X
  943. X#if ANSI_C
  944. Xstruct bwb_line *
  945. Xbwb_kill( struct bwb_line *l )
  946. X#else
  947. Xstruct bwb_line *
  948. Xbwb_kill( l )
  949. X   struct bwb_line *l;
  950. X#endif
  951. X   {
  952. X   int r;
  953. X   static int position;
  954. X   struct exp_ese *e;
  955. X   static char *atbuf;
  956. X   static int init = FALSE;
  957. X
  958. X   /* get memory for temporary buffers if necessary */
  959. X
  960. X   if ( init == FALSE )
  961. X      {
  962. X      init = TRUE;
  963. X      if ( ( atbuf = calloc( MAXSTRINGSIZE + 1, sizeof( char ) )) == NULL )
  964. X         {
  965. X#if PROG_ERRORS
  966. X     bwb_error( "in bwb_kill(): failed to find memory for atbuf" );
  967. X#else
  968. X     bwb_error( err_getmem );
  969. X#endif
  970. X     }
  971. X      }
  972. X
  973. X   /* get the next element in atbuf */
  974. X
  975. X   adv_element( l->buffer, &( l->position ), atbuf  );
  976. X
  977. X#if INTENSIVE_DEBUG
  978. X   sprintf( bwb_ebuf, "in bwb_kill(): argument is <%s>", atbuf );
  979. X   bwb_debug( bwb_ebuf );
  980. X#endif
  981. X
  982. X   /* interpret the argument */
  983. X
  984. X   position = 0;
  985. X   e = bwb_exp( atbuf, FALSE, &position );
  986. X
  987. X   if ( e->type != STRING )
  988. X      {
  989. X      bwb_error( err_argstr );
  990. X      return bwb_zline( l );
  991. X      }
  992. X
  993. X   /* try to delete the specified file */
  994. X
  995. X   str_btoc( atbuf, &( e->sval ) );
  996. X   r = unlink( atbuf );
  997. X
  998. X   /* detect error */
  999. X
  1000. X   if ( r == -1 )
  1001. X      {
  1002. X      bwb_error( err_opsys );
  1003. X      }
  1004. X
  1005. X   return bwb_zline( l );
  1006. X
  1007. X   }
  1008. X
  1009. X#endif                /* UNIX_CMDS */
  1010. X
  1011. X#if COMMON_CMDS
  1012. X
  1013. X/***************************************************************
  1014. X
  1015. X        FUNCTION:       bwb_name()
  1016. X
  1017. X    DESCRIPTION:    This function implements the BASIC NAME
  1018. X            command to rename a disk file.
  1019. X
  1020. X    SYNTAX:         NAME old_filename AS new_filename
  1021. X
  1022. X***************************************************************/
  1023. X
  1024. X#if ANSI_C
  1025. Xstruct bwb_line *
  1026. Xbwb_name( struct bwb_line *l )
  1027. X#else
  1028. Xstruct bwb_line *
  1029. Xbwb_name( l )
  1030. X   struct bwb_line *l;
  1031. X#endif
  1032. X   {
  1033. X   int r;
  1034. X   static int position;
  1035. X   struct exp_ese *e;
  1036. X   static char *atbuf;
  1037. X   static char *btbuf;
  1038. X   static int init = FALSE;
  1039. X
  1040. X   /* get memory for temporary buffers if necessary */
  1041. X
  1042. X   if ( init == FALSE )
  1043. X      {
  1044. X      init = TRUE;
  1045. X      if ( ( atbuf = calloc( MAXSTRINGSIZE + 1, sizeof( char ) )) == NULL )
  1046. X         {
  1047. X#if PROG_ERRORS
  1048. X     bwb_error( "in bwb_name(): failed to find memory for atbuf" );
  1049. X#else
  1050. X     bwb_error( err_getmem );
  1051. X#endif
  1052. X     }
  1053. X      if ( ( btbuf = calloc( MAXSTRINGSIZE + 1, sizeof( char ) )) == NULL )
  1054. X     {
  1055. X#if PROG_ERRORS
  1056. X     bwb_error( "in bwb_name(): failed to find memory for btbuf" );
  1057. X#else
  1058. X     bwb_error( err_getmem );
  1059. X#endif
  1060. X     }
  1061. X      }
  1062. X
  1063. X   /* get the first argument in atbuf */
  1064. X
  1065. X   adv_element( l->buffer, &( l->position ), atbuf  );
  1066. X
  1067. X   /* interpret the first argument */
  1068. X
  1069. X   position = 0;
  1070. X   e = bwb_exp( atbuf, FALSE, &position );
  1071. X
  1072. X   if ( e->type != STRING )
  1073. X      {
  1074. X      bwb_error( err_argstr );
  1075. X      return bwb_zline( l );
  1076. X      }
  1077. X
  1078. X   /* this argument must be copied back to atbuf, else the next
  1079. X      call to bwb_exp() will overwrite the structure to which e
  1080. X      refers */
  1081. X
  1082. X   str_btoc( atbuf, &( e->sval ) );
  1083. X
  1084. X#if INTENSIVE_DEBUG
  1085. X   sprintf( bwb_ebuf, "in bwb_name(): old name is <%s>", atbuf );
  1086. X   bwb_debug( bwb_ebuf );
  1087. X#endif
  1088. X
  1089. X   /* get the second argument in btbuf */
  1090. X
  1091. X   adv_element( l->buffer, &( l->position ), btbuf  );
  1092. X   bwb_strtoupper( btbuf );
  1093. X
  1094. X#if INTENSIVE_DEBUG
  1095. X   sprintf( bwb_ebuf, "in bwb_name(): AS string is <%s>", btbuf );
  1096. X   bwb_debug( bwb_ebuf );
  1097. X#endif
  1098. X
  1099. X   if ( strcmp( btbuf, "AS" ) != 0 )
  1100. X      {
  1101. X      bwb_error( err_syntax );
  1102. X      return bwb_zline( l );
  1103. X      }
  1104. X
  1105. X   /* get the third argument in btbuf */
  1106. X
  1107. X   adv_element( l->buffer, &( l->position ), btbuf  );
  1108. X
  1109. X   /* interpret the third argument */
  1110. X
  1111. X   position = 0;
  1112. X   e = bwb_exp( btbuf, FALSE, &position );
  1113. X
  1114. X   if ( e->type != STRING )
  1115. X      {
  1116. X      bwb_error( err_argstr );
  1117. X      return bwb_zline( l );
  1118. X      }
  1119. X
  1120. X   str_btoc( btbuf, &( e->sval ) );
  1121. X
  1122. X#if INTENSIVE_DEBUG
  1123. X   sprintf( bwb_ebuf, "in bwb_name(): new name is <%s>", btbuf );
  1124. X   bwb_debug( bwb_ebuf );
  1125. X#endif
  1126. X
  1127. X   /* try to rename the file */
  1128. X
  1129. X   r = rename( atbuf, btbuf );
  1130. X
  1131. X   /* detect error */
  1132. X
  1133. X   if ( r != 0 )
  1134. X      {
  1135. X      bwb_error( err_opsys );
  1136. X      }
  1137. X
  1138. X   return bwb_zline( l );
  1139. X
  1140. X   }
  1141. X
  1142. X/***************************************************************
  1143. X
  1144. X        FUNCTION:       bwb_field()
  1145. X
  1146. X        DESCRIPTION:    This C function implements the BASIC
  1147. X            FIELD command.
  1148. X
  1149. X***************************************************************/
  1150. X
  1151. X#if ANSI_C
  1152. Xstruct bwb_line *
  1153. Xbwb_field( struct bwb_line *l )
  1154. X#else
  1155. Xstruct bwb_line *
  1156. Xbwb_field( l )
  1157. X   struct bwb_line *l;
  1158. X#endif
  1159. X   {
  1160. X   int dev_number;
  1161. X   int length;
  1162. X   struct exp_ese *e;
  1163. X   struct bwb_variable *v;
  1164. X   bstring *b;
  1165. X   int current_pos;
  1166. X   char atbuf[ MAXSTRINGSIZE + 1 ];
  1167. X
  1168. X   current_pos = 0;
  1169. X
  1170. X   /* first read device number */
  1171. X
  1172. X   adv_ws( l->buffer, &( l->position ) );
  1173. X   if ( l->buffer[ l->position ] =='#' )
  1174. X      {
  1175. X      ++( l->position );
  1176. X      }
  1177. X
  1178. X   adv_element( l->buffer, &( l->position ), atbuf );
  1179. X
  1180. X#if INTENSIVE_DEBUG
  1181. X   sprintf( bwb_ebuf, "in bwb_field(): device# buffer <%s>", atbuf );
  1182. X   bwb_debug( bwb_ebuf );
  1183. X#endif
  1184. X
  1185. X   pos = 0;
  1186. X   e = bwb_exp( atbuf, FALSE, &pos );
  1187. X
  1188. X   if ( e->type != NUMBER )
  1189. X      {
  1190. X#if PROG_ERRORS
  1191. X      bwb_error( "in bwb_field(): Number was expected for device number" );
  1192. X#else
  1193. X      bwb_error( err_syntax );
  1194. X#endif
  1195. X      return bwb_zline( l );
  1196. X      }
  1197. X
  1198. X   dev_number = (int) exp_getnval( e );
  1199. X
  1200. X#if INTENSIVE_DEBUG
  1201. X   sprintf( bwb_ebuf, "in bwb_field(): device <%d>", dev_number );
  1202. X   bwb_debug( bwb_ebuf );
  1203. X#endif
  1204. X
  1205. X   /* be sure that the requested device is open */
  1206. X
  1207. X   if (( dev_table[ dev_number ].mode == DEVMODE_CLOSED ) ||
  1208. X      ( dev_table[ req_devnumber ].mode == DEVMODE_AVAILABLE ) )
  1209. X      {
  1210. X#if PROG_ERRORS
  1211. X      bwb_error( "in bwb_field(): Requested device number is not in use." );
  1212. X#else
  1213. X      bwb_error( err_devnum );
  1214. X#endif
  1215. X      return bwb_zline( l );
  1216. X      }
  1217. X
  1218. X   /* loop to read variables */
  1219. X
  1220. X   do
  1221. X      {
  1222. X
  1223. X      /* read the comma and advance beyond it */
  1224. X
  1225. X      adv_ws( l->buffer, &( l->position ) );
  1226. X      if ( l->buffer[ l->position ] ==',' )
  1227. X         {
  1228. X         ++( l->position );
  1229. X         }
  1230. X
  1231. X      /* first find the size of the field */
  1232. X
  1233. X      adv_element( l->buffer, &( l->position ), atbuf );    /* get element */
  1234. X
  1235. X      pos = 0;
  1236. X      e = bwb_exp( atbuf, FALSE, &pos );
  1237. X
  1238. X      if ( e->type != NUMBER )
  1239. X         {
  1240. X#if PROG_ERRORS
  1241. X         bwb_error( "in bwb_field(): number value for field size not found" );
  1242. X#else
  1243. X         bwb_error( err_syntax );
  1244. X#endif
  1245. X         return bwb_zline( l );
  1246. X         }
  1247. X
  1248. X      length = (int) exp_getnval( e );
  1249. X
  1250. X#if INTENSIVE_DEBUG
  1251. X      sprintf( bwb_ebuf, "in bwb_field(): device <%d> length <%d> buf <%s>",
  1252. X         dev_number, length, &( l->buffer[ l->position ] ) );
  1253. X      bwb_debug( bwb_ebuf );
  1254. X#endif
  1255. X
  1256. X      /* read the AS */
  1257. X
  1258. X      adv_element( l->buffer, &( l->position ), atbuf );    /* get element */
  1259. X      bwb_strtoupper( atbuf );
  1260. X
  1261. X#if INTENSIVE_DEBUG
  1262. X      sprintf( bwb_ebuf, "in bwb_field(): AS element <%s>", atbuf );
  1263. X      bwb_debug( bwb_ebuf );
  1264. X#endif
  1265. X
  1266. X      if ( strncmp( atbuf, "AS", 2 ) != 0 )
  1267. X         {
  1268. X#if PROG_ERRORS
  1269. X         bwb_error( "in bwb_field(): AS statement not found" );
  1270. X#else
  1271. X         bwb_error( err_syntax );
  1272. X#endif
  1273. X         return bwb_zline( l );
  1274. X         }
  1275. X
  1276. X      /* read the string variable name */
  1277. X
  1278. X      adv_element( l->buffer, &( l->position ), atbuf );    /* get element */
  1279. X      v = var_find( atbuf );
  1280. X
  1281. X      if ( v->type != STRING )
  1282. X         {
  1283. X#if PROG_ERRORS
  1284. X         bwb_error( "in bwb_field(): string variable name not found" );
  1285. X#else
  1286. X         bwb_error( err_syntax );
  1287. X#endif
  1288. X         return bwb_zline( l );
  1289. X         }
  1290. X
  1291. X#if INTENSIVE_DEBUG
  1292. X      sprintf( bwb_ebuf, "in bwb_field(): device <%d> var <%s> length <%d>",
  1293. X         dev_number, v->name, length );
  1294. X      bwb_debug( bwb_ebuf );
  1295. X#endif
  1296. X
  1297. X      /* check for overflow of record length */
  1298. X
  1299. X      if ( ( current_pos + length ) > dev_table[ dev_number ].reclen )
  1300. X         {
  1301. X#if PROG_ERRORS
  1302. X         bwb_error( "in bwb_field(): record length exceeded" );
  1303. X#else
  1304. X         bwb_error( err_overflow );
  1305. X#endif
  1306. X         return bwb_zline( l );
  1307. X         }
  1308. X
  1309. X      /* set buffer */
  1310. X
  1311. X      b = var_findsval( v, v->array_pos );
  1312. X
  1313. X#if DONTDOTHIS
  1314. X      if ( b->sbuffer != NULL )
  1315. X     {
  1316. X     free( b->sbuffer );
  1317. X     }
  1318. X#endif
  1319. X
  1320. X      b->sbuffer = dev_table[ dev_number ].buffer + current_pos;
  1321. X      b->length = (unsigned char) length;
  1322. X      b->rab = TRUE;
  1323. X
  1324. X      current_pos += length;
  1325. X
  1326. X#if INTENSIVE_DEBUG
  1327. X      sprintf( bwb_ebuf, "in bwb_field(): buffer <%lXh> var <%s> buffer <%lXh>",
  1328. X         (long) dev_table[ dev_number ].buffer, v->name, (long) b->buffer );
  1329. X      bwb_debug( bwb_ebuf );
  1330. X#endif
  1331. X
  1332. X      /* eat up any remaining whitespace */
  1333. X
  1334. X      adv_ws( l->buffer, &( l->position ) );
  1335. X
  1336. X      }
  1337. X
  1338. X   while ( l->buffer[ l->position ] == ',' );
  1339. X
  1340. X   /* return */
  1341. X
  1342. X   return bwb_zline( l );
  1343. X
  1344. X   }
  1345. X
  1346. X/***************************************************************
  1347. X
  1348. X        FUNCTION:       bwb_lset()
  1349. X
  1350. X        DESCRIPTION:    This C function implements the BASIC
  1351. X            LSET command.
  1352. X
  1353. X    SYNTAX:        LSET string-variable$ = expression
  1354. X
  1355. X***************************************************************/
  1356. X
  1357. X#if ANSI_C
  1358. Xstruct bwb_line *
  1359. Xbwb_lset( struct bwb_line *l )
  1360. X#else
  1361. Xstruct bwb_line *
  1362. Xbwb_lset( l )
  1363. X   struct bwb_line *l;
  1364. X#endif
  1365. X   {
  1366. X   return dio_lrset( l, FALSE );
  1367. X   }
  1368. X
  1369. X/***************************************************************
  1370. X
  1371. X        FUNCTION:       bwb_rset()
  1372. X
  1373. X        DESCRIPTION:    This C function implements the BASIC
  1374. X            RSET command.
  1375. X
  1376. X    SYNTAX:        RSET string-variable$ = expression
  1377. X
  1378. X***************************************************************/
  1379. X
  1380. X#if ANSI_C
  1381. Xstruct bwb_line *
  1382. Xbwb_rset( struct bwb_line *l )
  1383. X#else
  1384. Xstruct bwb_line *
  1385. Xbwb_rset( l )
  1386. X   struct bwb_line *l;
  1387. X#endif
  1388. X   {
  1389. X   return dio_lrset( l, TRUE );
  1390. X   }
  1391. X
  1392. X/***************************************************************
  1393. X
  1394. X        FUNCTION:       dio_lrset()
  1395. X
  1396. X        DESCRIPTION:    This C function implements the BASIC
  1397. X            RSET and LSET commands.
  1398. X
  1399. X***************************************************************/
  1400. X
  1401. X#if ANSI_C
  1402. Xstatic struct bwb_line *
  1403. Xdio_lrset( struct bwb_line *l, int rset )
  1404. X#else
  1405. Xstatic struct bwb_line *
  1406. Xdio_lrset( l, rset )
  1407. X   struct bwb_line *l;
  1408. X   int rset;
  1409. X#endif
  1410. X   {
  1411. X   char varname[ MAXVARNAMESIZE + 1 ];
  1412. X   bstring *d, *s;
  1413. X   int *pp;
  1414. X   int n_params;
  1415. X   int p;
  1416. X   register int n, i;
  1417. X   int startpos;
  1418. X   struct exp_ese *e;
  1419. X
  1420. X   /* find the variable name */
  1421. X
  1422. X   bwb_getvarname( l->buffer, varname, &( l->position ));
  1423. X
  1424. X   v = var_find( varname );
  1425. X
  1426. X   if ( v == NULL )
  1427. X      {
  1428. X#if PROG_ERRORS
  1429. X      sprintf( bwb_ebuf, "in dio_lrset(): failed to find variable" );
  1430. X      bwb_error( bwb_ebuf );
  1431. X#else
  1432. X      bwb_error( err_syntax );
  1433. X#endif
  1434. X      }
  1435. X
  1436. X   if ( v->type != STRING )
  1437. X      {
  1438. X#if PROG_ERRORS
  1439. X      sprintf( bwb_ebuf, "in dio_lrset(): assignment must be to string variable" );
  1440. X      bwb_error( bwb_ebuf );
  1441. X#else
  1442. X      bwb_error( err_syntax );
  1443. X#endif
  1444. X      }
  1445. X
  1446. X   /* read subscripts */
  1447. X
  1448. X   pos = 0;
  1449. X   if ( ( v->dimensions == 1 ) && ( v->array_sizes[ 0 ] == 1 ))
  1450. X      {
  1451. X#if INTENSIVE_DEBUG
  1452. X      sprintf( bwb_ebuf, "in dio_lrset(): variable <%s> has 1 dimension",
  1453. X         v->name );
  1454. X      bwb_debug( bwb_ebuf );
  1455. X#endif
  1456. X      n_params = 1;
  1457. X      pp = &p;
  1458. X      pp[ 0 ] = dim_base;
  1459. X      }
  1460. X   else
  1461. X      {
  1462. X#if INTENSIVE_DEBUG
  1463. X      sprintf( bwb_ebuf, "in dio_lrset(): variable <%s> has > 1 dimensions",
  1464. X         v->name );
  1465. X      bwb_debug( bwb_ebuf );
  1466. X#endif
  1467. X      dim_getparams( l->buffer, &( l->position ), &n_params, &pp );
  1468. X      }
  1469. X
  1470. X   CURTASK exps[ CURTASK expsc ].pos_adv = pos;
  1471. X   for ( n = 0; n < v->dimensions; ++n )
  1472. X      {
  1473. X      v->array_pos[ n ] = pp[ n ];
  1474. X      }
  1475. X
  1476. X   /* get bstring pointer */
  1477. X
  1478. X   d = var_findsval( v, pp );
  1479. X
  1480. X   /* find equals sign */
  1481. X
  1482. X   adv_ws( l->buffer, &( l->position ));
  1483. X   if ( l->buffer[ l->position ] != '=' )
  1484. X      {
  1485. X#if PROG_ERRORS
  1486. X      sprintf( bwb_ebuf, "in dio_lrset(): failed to find equal sign" );
  1487. X      bwb_error( bwb_ebuf );
  1488. X#else
  1489. X      bwb_error( err_syntax );
  1490. X#endif
  1491. X      }
  1492. X   ++( l->position );
  1493. X   adv_ws( l->buffer, &( l->position ));
  1494. X
  1495. X   /* read remainder of line to get value */
  1496. X
  1497. X   e = bwb_exp( l->buffer, FALSE, &( l->position ) );
  1498. X   s = exp_getsval( e );
  1499. X
  1500. X   /* set starting position */
  1501. X
  1502. X   startpos = 0;
  1503. X   if ( rset == TRUE )
  1504. X      {
  1505. X      if ( s->length < d->length )
  1506. X         {
  1507. X         startpos = d->length - s->length;
  1508. X         }
  1509. X      }
  1510. X
  1511. X#if INTENSIVE_DEBUG
  1512. X   sprintf( bwb_ebuf, "in dio_lrset(): startpos <%d> buffer <%lX>",
  1513. X      startpos, (long) d->buffer );
  1514. X   bwb_debug( bwb_ebuf );
  1515. X#endif
  1516. X
  1517. X   /* write characters to new position */
  1518. X
  1519. X   i = 0;
  1520. X   for ( n = startpos; ( i < (int) s->length ) && ( n < (int) d->length ); ++n )
  1521. X      {
  1522. X      d->sbuffer[ n ] = s->sbuffer[ i ];
  1523. X      ++i;
  1524. X      }
  1525. X
  1526. X   /* return */
  1527. X
  1528. X   return bwb_zline( l );
  1529. X
  1530. X   }
  1531. X
  1532. X/***************************************************************
  1533. X
  1534. X        FUNCTION:       bwb_get()
  1535. X
  1536. X        DESCRIPTION:    This C function implements the BASIC
  1537. X            GET command.
  1538. X
  1539. X    SYNTAX:        GET [#] device-number [, record-number]
  1540. X
  1541. X***************************************************************/
  1542. X
  1543. X#if ANSI_C
  1544. Xstruct bwb_line *
  1545. Xbwb_get( struct bwb_line *l )
  1546. X#else
  1547. Xstruct bwb_line *
  1548. Xbwb_get( l )
  1549. X   struct bwb_line *l;
  1550. X#endif
  1551. X   {
  1552. X   int dev_number;
  1553. X   int rec_number;
  1554. X   register int i;
  1555. X   struct exp_ese *e;
  1556. X   char atbuf[ MAXSTRINGSIZE + 1 ];
  1557. X
  1558. X   /* first read device number */
  1559. X
  1560. X   adv_ws( l->buffer, &( l->position ) );
  1561. X   if ( l->buffer[ l->position ] =='#' )
  1562. X      {
  1563. X      ++( l->position );
  1564. X      }
  1565. X
  1566. X   adv_element( l->buffer, &( l->position ), atbuf );
  1567. X
  1568. X   pos = 0;
  1569. X   e = bwb_exp( atbuf, FALSE, &pos );
  1570. X
  1571. X   if ( e->type != NUMBER )
  1572. X      {
  1573. X#if PROG_ERRORS
  1574. X      bwb_error( "in bwb_get(): Number was expected for device number" );
  1575. X#else
  1576. X      bwb_error( err_syntax );
  1577. X#endif
  1578. X      return bwb_zline( l );
  1579. X      }
  1580. X
  1581. X   dev_number = (int) exp_getnval( e );
  1582. X
  1583. X#if INTENSIVE_DEBUG
  1584. X   sprintf( bwb_ebuf, "in bwb_get(): device <%d>", dev_number );
  1585. X   bwb_debug( bwb_ebuf );
  1586. X#endif
  1587. X
  1588. X   /* be sure that the requested device is open */
  1589. X
  1590. X   if ( ( dev_table[ dev_number ].mode == DEVMODE_CLOSED ) ||
  1591. X      ( dev_table[ req_devnumber ].mode == DEVMODE_AVAILABLE ) )
  1592. X      {
  1593. X#if PROG_ERRORS
  1594. X      bwb_error( "in bwb_get(): Requested device number is not in use." );
  1595. X#else
  1596. X      bwb_error( err_devnum );
  1597. X#endif
  1598. X      return bwb_zline( l );
  1599. X      }
  1600. X
  1601. X   /* see if there is a comma (and record number) */
  1602. X
  1603. X   adv_ws( l->buffer, &( l->position ) );
  1604. X   if ( l->buffer[ l->position ] == ',' )    /* yes, there is a comma */
  1605. X      {
  1606. X      ++( l->position );
  1607. X
  1608. X      /* get the record number element */
  1609. X
  1610. X      adv_element( l->buffer, &( l->position ), atbuf );
  1611. X
  1612. X      pos = 0;
  1613. X      e = bwb_exp( atbuf, FALSE, &pos );
  1614. X      rec_number = (int) exp_getnval( e );
  1615. X
  1616. X      }
  1617. X
  1618. X   else                /* no record number given */
  1619. X      {
  1620. X      rec_number = dev_table[ dev_number ].next_record;
  1621. X      }
  1622. X
  1623. X#if INTENSIVE_DEBUG
  1624. X   sprintf( bwb_ebuf, "in bwb_get(): record number <%d>", rec_number );
  1625. X   bwb_debug( bwb_ebuf );
  1626. X#endif
  1627. X
  1628. X   /* wind the c file up to the proper point */
  1629. X
  1630. X   if ( fseek( dev_table[ dev_number ].cfp,
  1631. X      (long) (( rec_number - 1 ) * dev_table[ dev_number ].reclen ),
  1632. X      SEEK_SET ) != 0 )
  1633. X      {
  1634. X#if PROG_ERRORS
  1635. X      sprintf( bwb_ebuf, "in bwb_get(): fseek() failed, rec number <%d> offset <%ld>",
  1636. X        rec_number, (long) (( rec_number - 1 ) * dev_table[ dev_number ].reclen ) );
  1637. X      bwb_error( bwb_ebuf );
  1638. X#else
  1639. X      bwb_error( err_dev );
  1640. X#endif
  1641. X      return bwb_zline( l );
  1642. X      }
  1643. X
  1644. X   /* read the requested bytes into the buffer */
  1645. X
  1646. X   for ( i = 0; i < dev_table[ dev_number ].reclen; ++i )
  1647. X      {
  1648. X      dev_table[ dev_number ].buffer[ i ] =
  1649. X         (char) fgetc( dev_table[ dev_number ].cfp );
  1650. X      ++( dev_table[ dev_number ].loc );
  1651. X      }
  1652. X
  1653. X   /* increment (or reset) the current record */
  1654. X
  1655. X   dev_table[ dev_number ].next_record = rec_number + 1;
  1656. X
  1657. X   return bwb_zline( l );
  1658. X
  1659. X   }
  1660. X
  1661. X/***************************************************************
  1662. X
  1663. X        FUNCTION:       bwb_put()
  1664. X
  1665. X        DESCRIPTION:    This C function implements the BASIC
  1666. X            PUT command.
  1667. X
  1668. X    SYNTAX:        PUT [#] device-number [, record-number]
  1669. X
  1670. X***************************************************************/
  1671. X
  1672. X#if ANSI_C
  1673. Xstruct bwb_line *
  1674. Xbwb_put( struct bwb_line *l )
  1675. X#else
  1676. Xstruct bwb_line *
  1677. Xbwb_put( l )
  1678. X   struct bwb_line *l;
  1679. X#endif
  1680. X   {
  1681. X   int dev_number;
  1682. X   int rec_number;
  1683. X   register int i;
  1684. X   struct exp_ese *e;
  1685. X   char atbuf[ MAXSTRINGSIZE + 1 ];
  1686. X
  1687. X   /* first read device number */
  1688. X
  1689. X   adv_ws( l->buffer, &( l->position ) );
  1690. X   if ( l->buffer[ l->position ] =='#' )
  1691. X      {
  1692. X      ++( l->position );
  1693. X      }
  1694. X
  1695. X   adv_element( l->buffer, &( l->position ), atbuf );
  1696. X   dev_number = atoi( atbuf );
  1697. X
  1698. X#if INTENSIVE_DEBUG
  1699. X   sprintf( bwb_ebuf, "in bwb_put(): device <%d>", dev_number );
  1700. X   bwb_debug( bwb_ebuf );
  1701. X#endif
  1702. X
  1703. X   /* be sure that the requested device is open */
  1704. X
  1705. X   if ( ( dev_table[ dev_number ].mode == DEVMODE_CLOSED ) ||
  1706. X      ( dev_table[ req_devnumber ].mode == DEVMODE_AVAILABLE ) )
  1707. X      {
  1708. X#if PROG_ERRORS
  1709. X      bwb_error( "in bwb_put(): Requested device number is not in use." );
  1710. X#else
  1711. X      bwb_error( err_devnum );
  1712. X#endif
  1713. X      return bwb_zline( l );
  1714. X      }
  1715. X
  1716. X   /* see if there is a comma (and record number) */
  1717. X
  1718. X   adv_ws( l->buffer, &( l->position ) );
  1719. X   if ( l->buffer[ l->position ] == ',' )    /* yes, there is a comma */
  1720. X      {
  1721. X      ++( l->position );
  1722. X
  1723. X      /* get the record number element */
  1724. X
  1725. X      adv_element( l->buffer, &( l->position ), atbuf );
  1726. X
  1727. X#if INTENSIVE_DEBUG
  1728. X      sprintf( bwb_ebuf, "in bwb_put(): rec no buffer <%s>", atbuf );
  1729. X      bwb_debug( bwb_ebuf );
  1730. X#endif
  1731. X
  1732. X      pos = 0;
  1733. X      e = bwb_exp( atbuf, FALSE, &pos );
  1734. X
  1735. X#if INTENSIVE_DEBUG
  1736. X      sprintf( bwb_ebuf, "in bwb_put(): return type <%c>", e->type );
  1737. X      bwb_debug( bwb_ebuf );
  1738. X#endif
  1739. X
  1740. X      rec_number = (int) exp_getnval( e );
  1741. X
  1742. X      }
  1743. X
  1744. X   else                /* no record number given */
  1745. X      {
  1746. X      rec_number = dev_table[ dev_number ].next_record;
  1747. X      }
  1748. X
  1749. X#if INTENSIVE_DEBUG
  1750. X   sprintf( bwb_ebuf, "in bwb_put(): record number <%d>", rec_number );
  1751. X   bwb_debug( bwb_ebuf );
  1752. X#endif
  1753. X
  1754. X   /* wind the c file up to the proper point */
  1755. X
  1756. X   if ( fseek( dev_table[ dev_number ].cfp,
  1757. X      (long) (( rec_number - 1 ) * dev_table[ dev_number ].reclen ),
  1758. X      SEEK_SET ) != 0 )
  1759. X      {
  1760. X#if PROG_ERRORS
  1761. X      sprintf( bwb_ebuf, "in bwb_get(): fseek() failed, rec number <%d> offset <%ld>",
  1762. X        rec_number, (long) (( rec_number - 1 ) * dev_table[ dev_number ].reclen ) );
  1763. X      bwb_error( bwb_ebuf );
  1764. X#else
  1765. X      bwb_error( err_dev );
  1766. X#endif
  1767. X      return bwb_zline( l );
  1768. X      }
  1769. X
  1770. X#if INTENSIVE_DEBUG
  1771. X   sprintf( bwb_ebuf, "in bwb_put(): ready to write to file, buffer <%lXh>",
  1772. X      (long) dev_table[ dev_number ].buffer );
  1773. X   bwb_debug( bwb_ebuf );
  1774. X   prn_xprintf( stderr, "Buffer: <" );
  1775. X#endif
  1776. X
  1777. X   /* write the requested bytes to the file */
  1778. X
  1779. X   for ( i = 0; i < dev_table[ dev_number ].reclen; ++i )
  1780. X      {
  1781. X      fputc( dev_table[ dev_number ].buffer[ i ],
  1782. X         dev_table[ dev_number ].cfp );
  1783. X#if INTENSIVE_DEBUG
  1784. X      xputc( stderr, dev_table[ dev_number ].buffer[ i ] );
  1785. X#endif
  1786. X      ++( dev_table[ dev_number ].loc );
  1787. X      }
  1788. X
  1789. X#if INTENSIVE_DEBUG
  1790. X   prn_xprintf( stderr, ">\n" );
  1791. X   sprintf( bwb_ebuf, "in bwb_put(): write to file complete" );
  1792. X   bwb_debug( bwb_ebuf );
  1793. X#endif
  1794. X
  1795. X   /* flush the buffer */
  1796. X
  1797. X   dio_flush( dev_number );
  1798. X
  1799. X   /* increment (or reset) the current record */
  1800. X
  1801. X   dev_table[ dev_number ].next_record = rec_number + 1;
  1802. X
  1803. X   return bwb_zline( l );
  1804. X
  1805. X   }
  1806. X
  1807. X/***************************************************************
  1808. X
  1809. X        FUNCTION:       dio_flush()
  1810. X
  1811. X        DESCRIPTION:    This C function flushes the random-access
  1812. X            buffer associated with file dev_number.
  1813. X
  1814. X***************************************************************/
  1815. X
  1816. X#if ANSI_C
  1817. Xstatic int
  1818. Xdio_flush( int dev_number )
  1819. X#else
  1820. Xstatic int
  1821. Xdio_flush( dev_number )
  1822. X   int dev_number;
  1823. X#endif
  1824. X   {
  1825. X   register int n;
  1826. X
  1827. X   if ( dev_table[ dev_number ].mode != DEVMODE_RANDOM )
  1828. X      {
  1829. X#if PROG_ERRORS
  1830. X      sprintf( bwb_ebuf, "in dio_flush(): only random-access buffers can be flushed" );
  1831. X      bwb_error( bwb_ebuf );
  1832. X#else
  1833. X      bwb_error( err_dev );
  1834. X#endif
  1835. X      }
  1836. X
  1837. X   /* fill buffer with blanks (or 'X' for test) */
  1838. X
  1839. X   for ( n = 0; n < dev_table[ req_devnumber ].reclen; ++n )
  1840. X      {
  1841. X      dev_table[ req_devnumber ].buffer[ n ] = RANDOM_FILLCHAR;
  1842. X      }
  1843. X
  1844. X   return TRUE;
  1845. X
  1846. X   }
  1847. X
  1848. X#endif                /* COMMON_CMDS */
  1849. X
  1850. X
  1851. END_OF_FILE
  1852.   if test 41067 -ne `wc -c <'bwbasic-2.10/bwb_dio.c'`; then
  1853.     echo shar: \"'bwbasic-2.10/bwb_dio.c'\" unpacked with wrong size!
  1854.   fi
  1855.   # end of 'bwbasic-2.10/bwb_dio.c'
  1856. fi
  1857. if test -f 'bwbasic-2.10/bwbtest/callfunc.bas' -a "${1}" != "-c" ; then 
  1858.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/callfunc.bas'\"
  1859. else
  1860.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/callfunc.bas'\" \(1032 characters\)
  1861.   sed "s/^X//" >'bwbasic-2.10/bwbtest/callfunc.bas' <<'END_OF_FILE'
  1862. X
  1863. Xrem ----------------------------------------------------
  1864. Xrem CallFunc.BAS
  1865. Xrem ----------------------------------------------------
  1866. X
  1867. XPrint "CallFunc.BAS -- Test BASIC User-defined Function Statements"
  1868. XPrint "The next printed line should be from the Function."
  1869. XPrint
  1870. Xtestvar = 17
  1871. X
  1872. Xx = TestFnc( 5, "Hello", testvar )
  1873. X
  1874. XPrint
  1875. XPrint "This is back at the main program. "
  1876. XPrint "The value of variable <testvar> is now "; testvar
  1877. XPrint "The returned value from the function is "; x
  1878. X
  1879. XPrint "Did it work?"
  1880. XEnd
  1881. X
  1882. Xrem ----------------------------------------------------
  1883. Xrem Subroutine TestFnc
  1884. Xrem ----------------------------------------------------
  1885. X
  1886. XFunction TestFnc( xarg, yarg$, tvar )
  1887. X   Print "This is written from the Function."
  1888. X   Print "The value of variable <xarg> is"; xarg
  1889. X   Print "The value of variable <yarg$> is "; yarg$
  1890. X   Print "The value of variable <tvar> is "; tvar
  1891. X   tvar = 99
  1892. X   Print "The value of variable <tvar> is reset to "; tvar
  1893. X   TestFnc = xarg + tvar
  1894. X   Print "The Function should return "; TestFnc
  1895. XEnd Function
  1896. END_OF_FILE
  1897.   if test 1032 -ne `wc -c <'bwbasic-2.10/bwbtest/callfunc.bas'`; then
  1898.     echo shar: \"'bwbasic-2.10/bwbtest/callfunc.bas'\" unpacked with wrong size!
  1899.   fi
  1900.   # end of 'bwbasic-2.10/bwbtest/callfunc.bas'
  1901. fi
  1902. if test -f 'bwbasic-2.10/bwbtest/callsub.bas' -a "${1}" != "-c" ; then 
  1903.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/callsub.bas'\"
  1904. else
  1905.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/callsub.bas'\" \(889 characters\)
  1906.   sed "s/^X//" >'bwbasic-2.10/bwbtest/callsub.bas' <<'END_OF_FILE'
  1907. X
  1908. Xrem ----------------------------------------------------
  1909. Xrem CallSub.BAS
  1910. Xrem ----------------------------------------------------
  1911. X
  1912. XPrint "CallSub.BAS -- Test BASIC Call and Sub Statements"
  1913. XPrint "The next printed line should be from the Subroutine."
  1914. XPrint
  1915. Xtestvar = 17
  1916. X
  1917. XCall TestSub 5, "Hello", testvar
  1918. X
  1919. XPrint
  1920. XPrint "This is back at the main program. "
  1921. XPrint "The value of variable <testvar> is now "; testvar
  1922. X
  1923. XPrint "Did it work?"
  1924. XEnd
  1925. X
  1926. Xrem ----------------------------------------------------
  1927. Xrem Subroutine TestSub
  1928. Xrem ----------------------------------------------------
  1929. X
  1930. XSub TestSub( xarg, yarg$, tvar )
  1931. X   Print "This is written from the Subroutine."
  1932. X   Print "The value of variable <xarg> is"; xarg
  1933. X   Print "The value of variable <yarg$> is "; yarg$
  1934. X   Print "The value of variable <tvar> is "; tvar
  1935. X   tvar = 99
  1936. X   Print "The value of variable <tvar> is reset to "; tvar
  1937. XEnd Sub
  1938. X
  1939. END_OF_FILE
  1940.   if test 889 -ne `wc -c <'bwbasic-2.10/bwbtest/callsub.bas'`; then
  1941.     echo shar: \"'bwbasic-2.10/bwbtest/callsub.bas'\" unpacked with wrong size!
  1942.   fi
  1943.   # end of 'bwbasic-2.10/bwbtest/callsub.bas'
  1944. fi
  1945. if test -f 'bwbasic-2.10/bwbtest/deffn.bas' -a "${1}" != "-c" ; then 
  1946.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/deffn.bas'\"
  1947. else
  1948.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/deffn.bas'\" \(240 characters\)
  1949.   sed "s/^X//" >'bwbasic-2.10/bwbtest/deffn.bas' <<'END_OF_FILE'
  1950. X10 REM ------------------------------------------ 
  1951. X20 PRINT "DEFFN.BAS -- Test DEF FN Statement" 
  1952. X30 DEF fnadd( x, y ) = x + y 
  1953. X40 PRINT fnadd( 2, 3 ) 
  1954. X50 DEF fnjoin$( a$, b$ ) = a$ + b$ 
  1955. X60 PRINT fnjoin$( chr$( &h43 ), "orrect" ) 
  1956. X70 END 
  1957. END_OF_FILE
  1958.   if test 240 -ne `wc -c <'bwbasic-2.10/bwbtest/deffn.bas'`; then
  1959.     echo shar: \"'bwbasic-2.10/bwbtest/deffn.bas'\" unpacked with wrong size!
  1960.   fi
  1961.   # end of 'bwbasic-2.10/bwbtest/deffn.bas'
  1962. fi
  1963. if test -f 'bwbasic-2.10/bwbtest/dowhile.bas' -a "${1}" != "-c" ; then 
  1964.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/dowhile.bas'\"
  1965. else
  1966.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/dowhile.bas'\" \(237 characters\)
  1967.   sed "s/^X//" >'bwbasic-2.10/bwbtest/dowhile.bas' <<'END_OF_FILE'
  1968. X10 REM DOWHILE.BAS -- Test DO WHILE-LOOP
  1969. X20 PRINT "START" 
  1970. X30 LET X = 0 
  1971. X40 DO WHILE X < 25
  1972. X50 PRINT "x is ";X 
  1973. X60 LET X = X + 1 
  1974. X70 LET Y = 0 
  1975. X80 DO WHILE Y < 2
  1976. X90 PRINT "y is "; Y 
  1977. X100 LET Y = Y + 1 
  1978. X110 LOOP
  1979. X120 LOOP
  1980. X130 PRINT "END" 
  1981. END_OF_FILE
  1982.   if test 237 -ne `wc -c <'bwbasic-2.10/bwbtest/dowhile.bas'`; then
  1983.     echo shar: \"'bwbasic-2.10/bwbtest/dowhile.bas'\" unpacked with wrong size!
  1984.   fi
  1985.   # end of 'bwbasic-2.10/bwbtest/dowhile.bas'
  1986. fi
  1987. if test -f 'bwbasic-2.10/bwbtest/elseif.bas' -a "${1}" != "-c" ; then 
  1988.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/elseif.bas'\"
  1989. else
  1990.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/elseif.bas'\" \(592 characters\)
  1991.   sed "s/^X//" >'bwbasic-2.10/bwbtest/elseif.bas' <<'END_OF_FILE'
  1992. X
  1993. Xrem -----------------------------------------------------
  1994. Xrem elseif.bas -- Test MultiLine IF-ELSEIF-THEN statement
  1995. Xrem -----------------------------------------------------
  1996. X
  1997. XPrint "ELSEIF.BAS -- Test MultiLine IF-THEN-ELSE Constructions"
  1998. X
  1999. XPrint
  2000. XPrint "The program should detect if the number you enter is 4 or 5 or 6."
  2001. XInput "Please enter a number, 1-9"; x
  2002. X
  2003. XIf x = 4 then
  2004. X   Print "The number is 4."
  2005. X
  2006. XElseif x = 5 then
  2007. X   Print "The number is 5."
  2008. X
  2009. XElseif x = 6 then
  2010. X   Print "The number is 6."
  2011. X
  2012. XElse
  2013. X   Print "The number is neither 4 nor 5 nor 6."
  2014. X
  2015. XEnd If
  2016. X
  2017. XPrint "This concludes our test."
  2018. END_OF_FILE
  2019.   if test 592 -ne `wc -c <'bwbasic-2.10/bwbtest/elseif.bas'`; then
  2020.     echo shar: \"'bwbasic-2.10/bwbtest/elseif.bas'\" unpacked with wrong size!
  2021.   fi
  2022.   # end of 'bwbasic-2.10/bwbtest/elseif.bas'
  2023. fi
  2024. if test -f 'bwbasic-2.10/bwbtest/end.bas' -a "${1}" != "-c" ; then 
  2025.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/end.bas'\"
  2026. else
  2027.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/end.bas'\" \(220 characters\)
  2028.   sed "s/^X//" >'bwbasic-2.10/bwbtest/end.bas' <<'END_OF_FILE'
  2029. X10 REM END.BAS -- Test END Statement 
  2030. X20 PRINT "END.BAS -- Test END Statement" 
  2031. X30 PRINT "If the program ends after this line, END worked OK." 
  2032. X40 END 
  2033. X50 PRINT "But if this line printed, then it did not work." 
  2034. X60 END 
  2035. END_OF_FILE
  2036.   if test 220 -ne `wc -c <'bwbasic-2.10/bwbtest/end.bas'`; then
  2037.     echo shar: \"'bwbasic-2.10/bwbtest/end.bas'\" unpacked with wrong size!
  2038.   fi
  2039.   # end of 'bwbasic-2.10/bwbtest/end.bas'
  2040. fi
  2041. if test -f 'bwbasic-2.10/bwbtest/fncallfn.bas' -a "${1}" != "-c" ; then 
  2042.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/fncallfn.bas'\"
  2043. else
  2044.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/fncallfn.bas'\" \(344 characters\)
  2045.   sed "s/^X//" >'bwbasic-2.10/bwbtest/fncallfn.bas' <<'END_OF_FILE'
  2046. X10 rem FNCALLFN.BAS -- Test User-defined function called
  2047. X20 rem                 from user-defined function
  2048. X30 def fnabs(x) = abs(x)
  2049. X40 def fncmp(y) = 1.45678+fnabs(y)
  2050. X50 print "Test user-defined function calling user-defined function"
  2051. X60 print "The result should be: ";2.45678
  2052. X70 q = -1.000
  2053. X80 print "The result is:      : "; fncmp( q )
  2054. X90 end
  2055. END_OF_FILE
  2056.   if test 344 -ne `wc -c <'bwbasic-2.10/bwbtest/fncallfn.bas'`; then
  2057.     echo shar: \"'bwbasic-2.10/bwbtest/fncallfn.bas'\" unpacked with wrong size!
  2058.   fi
  2059.   # end of 'bwbasic-2.10/bwbtest/fncallfn.bas'
  2060. fi
  2061. if test -f 'bwbasic-2.10/bwbtest/fornext.bas' -a "${1}" != "-c" ; then 
  2062.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/fornext.bas'\"
  2063. else
  2064.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/fornext.bas'\" \(343 characters\)
  2065.   sed "s/^X//" >'bwbasic-2.10/bwbtest/fornext.bas' <<'END_OF_FILE'
  2066. X10 REM FORNEXT.BAS -- Test FOR-NEXT Statements 
  2067. X20 REM 
  2068. X30 PRINT "FORNEXT.BAS: Test FOR-NEXT Statements" 
  2069. X40 PRINT "A FOR-NEXT Loop with STEP statement:" 
  2070. X50 FOR i=1 to 30 step 2 
  2071. X60 PRINT "FOR: i is ";i 
  2072. X70 NEXT i 
  2073. X80 REM 
  2074. X90 PRINT "A FOR-NEXT Loop without STEP statement:" 
  2075. X100 FOR i = 2 to 7 
  2076. X110 PRINT "FOR: i is ";i 
  2077. X120 NEXT i 
  2078. X130 END 
  2079. END_OF_FILE
  2080.   if test 343 -ne `wc -c <'bwbasic-2.10/bwbtest/fornext.bas'`; then
  2081.     echo shar: \"'bwbasic-2.10/bwbtest/fornext.bas'\" unpacked with wrong size!
  2082.   fi
  2083.   # end of 'bwbasic-2.10/bwbtest/fornext.bas'
  2084. fi
  2085. if test -f 'bwbasic-2.10/bwbtest/gosub.bas' -a "${1}" != "-c" ; then 
  2086.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/gosub.bas'\"
  2087. else
  2088.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/gosub.bas'\" \(1086 characters\)
  2089.   sed "s/^X//" >'bwbasic-2.10/bwbtest/gosub.bas' <<'END_OF_FILE'
  2090. X10 REM -------------------------------------------------------- 
  2091. X20 REM GOSUB.BAS Test Bywater BASIC Interpreter GOSUB Statement
  2092. X30 REM -------------------------------------------------------- 
  2093. X40 GOSUB 160 
  2094. X50 PRINT "Test GOSUB Statements" 
  2095. X60 PRINT "---------------------" 
  2096. X70 PRINT 
  2097. X80 PRINT "1 - Run Subroutine" 
  2098. X90 PRINT "9 - Exit to system" 
  2099. X92 PRINT "x - Exit to BASIC" 
  2100. X100 PRINT 
  2101. X110 INPUT c$ 
  2102. X120 IF c$ = "1" then gosub 430 
  2103. X130 IF c$ = "9" then goto 600 
  2104. X132 IF c$ = "x" then end 
  2105. X134 IF c$ = "X" then end 
  2106. X140 GOTO 10 
  2107. X150 END 
  2108. X160 REM subroutine to clear screen 
  2109. X170 PRINT 
  2110. X180 PRINT 
  2111. X190 PRINT 
  2112. X200 PRINT 
  2113. X210 PRINT 
  2114. X220 PRINT 
  2115. X230 PRINT 
  2116. X240 PRINT 
  2117. X250 PRINT 
  2118. X260 PRINT 
  2119. X270 PRINT 
  2120. X280 PRINT 
  2121. X290 PRINT 
  2122. X300 PRINT 
  2123. X310 PRINT 
  2124. X320 PRINT 
  2125. X330 PRINT 
  2126. X340 PRINT 
  2127. X350 PRINT 
  2128. X360 PRINT 
  2129. X370 PRINT 
  2130. X380 PRINT 
  2131. X390 PRINT 
  2132. X400 PRINT 
  2133. X410 PRINT 
  2134. X420 RETURN 
  2135. X430 REM subroutine to test branching 
  2136. X435 GOSUB 160 
  2137. X440 PRINT "This is the subroutine." 
  2138. X445 PRINT "Press any key: "; 
  2139. X450 INPUT x$ 
  2140. X460 RETURN 
  2141. X600 GOSUB 160 
  2142. X610 PRINT "Exit from Bywater BASIC Test Program" 
  2143. X620 SYSTEM 
  2144. END_OF_FILE
  2145.   if test 1086 -ne `wc -c <'bwbasic-2.10/bwbtest/gosub.bas'`; then
  2146.     echo shar: \"'bwbasic-2.10/bwbtest/gosub.bas'\" unpacked with wrong size!
  2147.   fi
  2148.   # end of 'bwbasic-2.10/bwbtest/gosub.bas'
  2149. fi
  2150. if test -f 'bwbasic-2.10/bwbtest/gotolabl.bas' -a "${1}" != "-c" ; then 
  2151.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/gotolabl.bas'\"
  2152. else
  2153.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/gotolabl.bas'\" \(253 characters\)
  2154.   sed "s/^X//" >'bwbasic-2.10/bwbtest/gotolabl.bas' <<'END_OF_FILE'
  2155. XPrint "Hello"
  2156. X
  2157. X
  2158. Xgoto test_label
  2159. XPrint "This should NOT print"
  2160. X
  2161. X
  2162. Xtest_label:
  2163. Xgosub test_sub
  2164. XPrint "Goodbye"
  2165. XEnd
  2166. X
  2167. X
  2168. Xtest_sub:
  2169. X   Print "This is the subroutine."
  2170. X   gosub test_subsub
  2171. X   Return
  2172. X
  2173. X
  2174. Xtest_subsub:
  2175. X   Print "This is the sub-subroutine."
  2176. X   Return
  2177. END_OF_FILE
  2178.   if test 253 -ne `wc -c <'bwbasic-2.10/bwbtest/gotolabl.bas'`; then
  2179.     echo shar: \"'bwbasic-2.10/bwbtest/gotolabl.bas'\" unpacked with wrong size!
  2180.   fi
  2181.   # end of 'bwbasic-2.10/bwbtest/gotolabl.bas'
  2182. fi
  2183. if test -f 'bwbasic-2.10/bwbtest/input.bas' -a "${1}" != "-c" ; then 
  2184.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/input.bas'\"
  2185. else
  2186.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/input.bas'\" \(207 characters\)
  2187.   sed "s/^X//" >'bwbasic-2.10/bwbtest/input.bas' <<'END_OF_FILE'
  2188. X10 REM INPUT.BAS -- Test INPUT Statement 
  2189. X20 PRINT "INPUT.BAS -- Test INPUT Statement" 
  2190. X30 REM 
  2191. X40 INPUT "Input string, number: "; s$, n 
  2192. X50 PRINT "The string is: ";s$ 
  2193. X60 PRINT "The number is: ";n 
  2194. X70 END 
  2195. END_OF_FILE
  2196.   if test 207 -ne `wc -c <'bwbasic-2.10/bwbtest/input.bas'`; then
  2197.     echo shar: \"'bwbasic-2.10/bwbtest/input.bas'\" unpacked with wrong size!
  2198.   fi
  2199.   # end of 'bwbasic-2.10/bwbtest/input.bas'
  2200. fi
  2201. if test -f 'bwbasic-2.10/bwbtest/main.bas' -a "${1}" != "-c" ; then 
  2202.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/main.bas'\"
  2203. else
  2204.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/main.bas'\" \(300 characters\)
  2205.   sed "s/^X//" >'bwbasic-2.10/bwbtest/main.bas' <<'END_OF_FILE'
  2206. X
  2207. XSub Prior
  2208. X   Print "This is a subroutine prior to MAIN."
  2209. X   Print "This should not print."
  2210. XEnd Sub
  2211. X
  2212. XSub Main
  2213. X   Print "This is the MAIN subroutine."
  2214. X   Print "This should print."
  2215. XEnd Sub
  2216. X
  2217. XSub Subsequent
  2218. X   Print "This is a subroutine subsequent to MAIN."
  2219. X   Print "This should not print."
  2220. XEnd Sub
  2221. X
  2222. X
  2223. END_OF_FILE
  2224.   if test 300 -ne `wc -c <'bwbasic-2.10/bwbtest/main.bas'`; then
  2225.     echo shar: \"'bwbasic-2.10/bwbtest/main.bas'\" unpacked with wrong size!
  2226.   fi
  2227.   # end of 'bwbasic-2.10/bwbtest/main.bas'
  2228. fi
  2229. if test -f 'bwbasic-2.10/bwbtest/on.bas' -a "${1}" != "-c" ; then 
  2230.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/on.bas'\"
  2231. else
  2232.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/on.bas'\" \(310 characters\)
  2233.   sed "s/^X//" >'bwbasic-2.10/bwbtest/on.bas' <<'END_OF_FILE'
  2234. X10 print "ON.BAS -- Test ON...GOTO Statement"
  2235. X20 input "Enter a number 1-5:";n
  2236. X30 on n goto 40, 60, 80, 100, 120
  2237. X40 print "You entered 1"
  2238. X50 goto 140
  2239. X60 print "You entered 2"
  2240. X70 goto 140
  2241. X80 print "You entered 3"
  2242. X90 goto 140
  2243. X100 print "You entered 4"
  2244. X110 goto 140
  2245. X120 print "You entered 5"
  2246. X130 goto 140
  2247. X140 end
  2248. END_OF_FILE
  2249.   if test 310 -ne `wc -c <'bwbasic-2.10/bwbtest/on.bas'`; then
  2250.     echo shar: \"'bwbasic-2.10/bwbtest/on.bas'\" unpacked with wrong size!
  2251.   fi
  2252.   # end of 'bwbasic-2.10/bwbtest/on.bas'
  2253. fi
  2254. if test -f 'bwbasic-2.10/bwbtest/onerr.bas' -a "${1}" != "-c" ; then 
  2255.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/onerr.bas'\"
  2256. else
  2257.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/onerr.bas'\" \(424 characters\)
  2258.   sed "s/^X//" >'bwbasic-2.10/bwbtest/onerr.bas' <<'END_OF_FILE'
  2259. X10 rem onerr.bas -- test bwBASIC ON ERROR GOSUB statement
  2260. X20 print "Test bwBASIC ON ERROR GOSUB statement"
  2261. X30 on error gosub 100
  2262. X40 print "The next line will include an error"
  2263. X50 if d$ = 78.98 then print "This should not print"
  2264. X60 print "This is the line after the error"
  2265. X70 end
  2266. X100 rem Error handler
  2267. X110 print "This is the error handler"
  2268. X120 print "The error number is ";err
  2269. X130 print "The error line   is ";erl
  2270. X150 return
  2271. END_OF_FILE
  2272.   if test 424 -ne `wc -c <'bwbasic-2.10/bwbtest/onerr.bas'`; then
  2273.     echo shar: \"'bwbasic-2.10/bwbtest/onerr.bas'\" unpacked with wrong size!
  2274.   fi
  2275.   # end of 'bwbasic-2.10/bwbtest/onerr.bas'
  2276. fi
  2277. if test -f 'bwbasic-2.10/bwbtest/onerrlbl.bas' -a "${1}" != "-c" ; then 
  2278.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/onerrlbl.bas'\"
  2279. else
  2280.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/onerrlbl.bas'\" \(392 characters\)
  2281.   sed "s/^X//" >'bwbasic-2.10/bwbtest/onerrlbl.bas' <<'END_OF_FILE'
  2282. Xrem onerrlbl.bas -- test bwBASIC ON ERROR GOSUB statement with label
  2283. Xprint "Test bwBASIC ON ERROR GOSUB statement"
  2284. Xon error gosub handler
  2285. Xprint "The next line will include an error"
  2286. Xif d$ = 78.98 then print "This should not print"
  2287. Xprint "This is the line after the error"
  2288. Xend
  2289. Xhandler:
  2290. Xprint "This is the error handler"
  2291. Xprint "The error number is ";err
  2292. Xprint "The error line   is ";erl
  2293. Xreturn
  2294. END_OF_FILE
  2295.   if test 392 -ne `wc -c <'bwbasic-2.10/bwbtest/onerrlbl.bas'`; then
  2296.     echo shar: \"'bwbasic-2.10/bwbtest/onerrlbl.bas'\" unpacked with wrong size!
  2297.   fi
  2298.   # end of 'bwbasic-2.10/bwbtest/onerrlbl.bas'
  2299. fi
  2300. if test -f 'bwbasic-2.10/bwbtest/ongosub.bas' -a "${1}" != "-c" ; then 
  2301.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/ongosub.bas'\"
  2302. else
  2303.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/ongosub.bas'\" \(326 characters\)
  2304.   sed "s/^X//" >'bwbasic-2.10/bwbtest/ongosub.bas' <<'END_OF_FILE'
  2305. X10 print "ONGOSUB.BAS -- Test ON..GOSUB Statement"
  2306. X20 input "Enter a number 1-5";n
  2307. X30 on n gosub 60, 80, 100, 120, 140
  2308. X40 print "The End"
  2309. X50 end
  2310. X60 print "You entered 1"
  2311. X70 return
  2312. X80 print "You entered 2"
  2313. X90 return
  2314. X100 print "You entered 3"
  2315. X110 return
  2316. X120 print "You entered 4"
  2317. X130 return
  2318. X140 print "You entered 5"
  2319. X150 return
  2320. END_OF_FILE
  2321.   if test 326 -ne `wc -c <'bwbasic-2.10/bwbtest/ongosub.bas'`; then
  2322.     echo shar: \"'bwbasic-2.10/bwbtest/ongosub.bas'\" unpacked with wrong size!
  2323.   fi
  2324.   # end of 'bwbasic-2.10/bwbtest/ongosub.bas'
  2325. fi
  2326. if test -f 'bwbasic-2.10/bwbtest/opentest.bas' -a "${1}" != "-c" ; then 
  2327.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/opentest.bas'\"
  2328. else
  2329.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/opentest.bas'\" \(328 characters\)
  2330.   sed "s/^X//" >'bwbasic-2.10/bwbtest/opentest.bas' <<'END_OF_FILE'
  2331. X10 PRINT "OPENTEST.BAS -- Test OPEN, PRINT#, LINE INPUT#, and CLOSE"
  2332. X20 OPEN "test.out" FOR OUTPUT AS # 1
  2333. X30 PRINT #1,"This is line 1."
  2334. X40 PRINT #1, "This is line 2."
  2335. X50 CLOSE #1
  2336. X60 OPEN "test.out" FOR INPUT AS #1
  2337. X70 LINE INPUT #1,A$
  2338. X80 LINE INPUT #1,B$
  2339. X90 PRINT "Read from file:"
  2340. X100 PRINT ">";A$
  2341. X110 PRINT ">";B$
  2342. X120 CLOSE #1
  2343. END_OF_FILE
  2344.   if test 328 -ne `wc -c <'bwbasic-2.10/bwbtest/opentest.bas'`; then
  2345.     echo shar: \"'bwbasic-2.10/bwbtest/opentest.bas'\" unpacked with wrong size!
  2346.   fi
  2347.   # end of 'bwbasic-2.10/bwbtest/opentest.bas'
  2348. fi
  2349. if test -f 'bwbasic-2.10/bwbtest/option.bas' -a "${1}" != "-c" ; then 
  2350.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/option.bas'\"
  2351. else
  2352.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/option.bas'\" \(188 characters\)
  2353.   sed "s/^X//" >'bwbasic-2.10/bwbtest/option.bas' <<'END_OF_FILE'
  2354. X1 PRINT "OPTION.BAS -- Test OPTION BASE Statement"
  2355. X5 OPTION BASE 1
  2356. X10 DIM n(5) 
  2357. X20 FOR i = 1 to 5 
  2358. X30 LET n(i) = i + 2 
  2359. X40 PRINT "The value at position ";i;" is ";n(i) 
  2360. X50 NEXT i 
  2361. X60 END 
  2362. END_OF_FILE
  2363.   if test 188 -ne `wc -c <'bwbasic-2.10/bwbtest/option.bas'`; then
  2364.     echo shar: \"'bwbasic-2.10/bwbtest/option.bas'\" unpacked with wrong size!
  2365.   fi
  2366.   # end of 'bwbasic-2.10/bwbtest/option.bas'
  2367. fi
  2368. if test -f 'bwbasic-2.10/bwbtest/pascaltr.bas' -a "${1}" != "-c" ; then 
  2369.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/pascaltr.bas'\"
  2370. else
  2371.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/pascaltr.bas'\" \(415 characters\)
  2372.   sed "s/^X//" >'bwbasic-2.10/bwbtest/pascaltr.bas' <<'END_OF_FILE'
  2373. X100   dim pascal(14,14)
  2374. X110   pascal(1,1) = 1
  2375. X120   for i = 2 to 14
  2376. X130           pascal(i,1) = 1
  2377. X140           for j = 2 to i
  2378. X150                   pascal(i,j) = pascal(i-1,j)+pascal(i-1,j-1)
  2379. X160           next j
  2380. X170   next i
  2381. X180   for i = 1 to 14
  2382. X190           print i-1; ": ";
  2383. X200           for j = 1 to i
  2384. X210                   print pascal(i,j);
  2385. X220           next j
  2386. X230           print 
  2387. X240   next i
  2388. X250   end
  2389. END_OF_FILE
  2390.   if test 415 -ne `wc -c <'bwbasic-2.10/bwbtest/pascaltr.bas'`; then
  2391.     echo shar: \"'bwbasic-2.10/bwbtest/pascaltr.bas'\" unpacked with wrong size!
  2392.   fi
  2393.   # end of 'bwbasic-2.10/bwbtest/pascaltr.bas'
  2394. fi
  2395. if test -f 'bwbasic-2.10/bwbtest/putget.bas' -a "${1}" != "-c" ; then 
  2396.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/putget.bas'\"
  2397. else
  2398.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/putget.bas'\" \(422 characters\)
  2399.   sed "s/^X//" >'bwbasic-2.10/bwbtest/putget.bas' <<'END_OF_FILE'
  2400. Xrem PUTGET.BAS -- Test PUT and GET statements
  2401. Xopen "r", 1, "test.dat", 48
  2402. Xfield 1, 20 as r1$, 20 as r2$, 8 as r3$
  2403. Xfor l = 1 to 2
  2404. Xline input "name: "; n$
  2405. Xline input "address: "; m$
  2406. Xline input "phone: "; p$
  2407. Xlset r1$ = n$
  2408. Xlset r2$ = m$
  2409. Xlset r3$ = p$
  2410. Xput #1, l
  2411. Xnext l
  2412. Xclose #1
  2413. Xopen "r", 1, "test.dat", 48
  2414. Xfield 1, 20 as r1$, 20 as r2$, 8 as r3$
  2415. Xfor l = 1 to 2
  2416. Xget #1, l
  2417. Xprint r1$, r2$, r3$
  2418. Xnext l
  2419. Xclose #1
  2420. Xkill "test.dat"
  2421. Xend
  2422. END_OF_FILE
  2423.   if test 422 -ne `wc -c <'bwbasic-2.10/bwbtest/putget.bas'`; then
  2424.     echo shar: \"'bwbasic-2.10/bwbtest/putget.bas'\" unpacked with wrong size!
  2425.   fi
  2426.   # end of 'bwbasic-2.10/bwbtest/putget.bas'
  2427. fi
  2428. if test -f 'bwbasic-2.10/bwbtest/random.bas' -a "${1}" != "-c" ; then 
  2429.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/random.bas'\"
  2430. else
  2431.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/random.bas'\" \(381 characters\)
  2432.   sed "s/^X//" >'bwbasic-2.10/bwbtest/random.bas' <<'END_OF_FILE'
  2433. X100 rem RANDOM.BAS -- Test RANDOMIZE and RND
  2434. X110 print "This is a first sequence of three RND numbers:"
  2435. X120 randomize timer
  2436. X130 print rnd
  2437. X140 print rnd
  2438. X150 print rnd
  2439. X160 print "This is a second sequence of three RND numbers:"
  2440. X170 randomize timer + 18
  2441. X180 print rnd
  2442. X190 print rnd
  2443. X200 print rnd
  2444. X210 print "The second sequence should have been differrent"
  2445. X220 print "from the first."
  2446. END_OF_FILE
  2447.   if test 381 -ne `wc -c <'bwbasic-2.10/bwbtest/random.bas'`; then
  2448.     echo shar: \"'bwbasic-2.10/bwbtest/random.bas'\" unpacked with wrong size!
  2449.   fi
  2450.   # end of 'bwbasic-2.10/bwbtest/random.bas'
  2451. fi
  2452. if test -f 'bwbasic-2.10/bwbtest/selcase.bas' -a "${1}" != "-c" ; then 
  2453.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/selcase.bas'\"
  2454. else
  2455.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/selcase.bas'\" \(556 characters\)
  2456.   sed "s/^X//" >'bwbasic-2.10/bwbtest/selcase.bas' <<'END_OF_FILE'
  2457. Xrem SelCase.bas  -- test SELECT CASE
  2458. X
  2459. XSub Main
  2460. X   Print "SelCase.bas -- test SELECT CASE statement"
  2461. X   Input "Enter a number"; d
  2462. X
  2463. X   Select Case d
  2464. X
  2465. X      Case 3 to 5
  2466. X         Print "The number is between 3 and 5."
  2467. X
  2468. X      Case 6
  2469. X         Print "The number you entered is 6."
  2470. X
  2471. X      Case 7 to 9
  2472. X         Print "The number is between 7 and 9."
  2473. X
  2474. X      Case If > 10
  2475. X         Print "The number is greater than 10"
  2476. X
  2477. X      Case If < 0
  2478. X         Print "The number is less than 0"
  2479. X
  2480. X      Case Else
  2481. X         Print "The number is 1, 2 or 10."
  2482. X
  2483. X   End Select
  2484. X
  2485. XEnd Sub
  2486. X
  2487. X
  2488. END_OF_FILE
  2489.   if test 556 -ne `wc -c <'bwbasic-2.10/bwbtest/selcase.bas'`; then
  2490.     echo shar: \"'bwbasic-2.10/bwbtest/selcase.bas'\" unpacked with wrong size!
  2491.   fi
  2492.   # end of 'bwbasic-2.10/bwbtest/selcase.bas'
  2493. fi
  2494. if test -f 'bwbasic-2.10/bwbtest/snglfunc.bas' -a "${1}" != "-c" ; then 
  2495.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/snglfunc.bas'\"
  2496. else
  2497.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/snglfunc.bas'\" \(323 characters\)
  2498.   sed "s/^X//" >'bwbasic-2.10/bwbtest/snglfunc.bas' <<'END_OF_FILE'
  2499. X
  2500. Xrem ----------------------------------------------------
  2501. Xrem SnglFunc.BAS
  2502. Xrem ----------------------------------------------------
  2503. X
  2504. XPrint "SnglFunc.BAS -- Test Single-Line User-defined Function Statement"
  2505. XPrint
  2506. X
  2507. XDef Sum( x, y ) = x + y
  2508. X
  2509. XPrint
  2510. XPrint "The sum of 6 and 4 is "; Sum( 6, 4 )
  2511. X
  2512. XPrint "Did it work properly?"
  2513. XEnd
  2514. END_OF_FILE
  2515.   if test 323 -ne `wc -c <'bwbasic-2.10/bwbtest/snglfunc.bas'`; then
  2516.     echo shar: \"'bwbasic-2.10/bwbtest/snglfunc.bas'\" unpacked with wrong size!
  2517.   fi
  2518.   # end of 'bwbasic-2.10/bwbtest/snglfunc.bas'
  2519. fi
  2520. if test -f 'bwbasic-2.10/bwbtest/stop.bas' -a "${1}" != "-c" ; then 
  2521.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/stop.bas'\"
  2522. else
  2523.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/stop.bas'\" \(234 characters\)
  2524.   sed "s/^X//" >'bwbasic-2.10/bwbtest/stop.bas' <<'END_OF_FILE'
  2525. X10 REM STOP.BAS -- Test STOP Statement 
  2526. X20 PRINT "STOP.BAS -- Test STOP Statement" 
  2527. X30 PRINT "If the program is interrupted after this line, STOP worked OK"
  2528. X40 STOP 
  2529. X50 PRINT "But if this line printed, then it did not work." 
  2530. X60 END 
  2531. END_OF_FILE
  2532.   if test 234 -ne `wc -c <'bwbasic-2.10/bwbtest/stop.bas'`; then
  2533.     echo shar: \"'bwbasic-2.10/bwbtest/stop.bas'\" unpacked with wrong size!
  2534.   fi
  2535.   # end of 'bwbasic-2.10/bwbtest/stop.bas'
  2536. fi
  2537. if test -f 'bwbasic-2.10/bwbtest/term.bas' -a "${1}" != "-c" ; then 
  2538.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/term.bas'\"
  2539. else
  2540.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/term.bas'\" \(312 characters\)
  2541.   sed "s/^X//" >'bwbasic-2.10/bwbtest/term.bas' <<'END_OF_FILE'
  2542. X10 REM BWBASIC Program to Demonstrate Terminal-Specific Use 
  2543. X20 REM The following definitions are for an ANSI Terminal. 
  2544. X30 REM You may have to define different variables for your 
  2545. X40 REM particular terminal 
  2546. X50 REM 
  2547. X60 LET CL$ = chr$(&h1b)+"[2J" 
  2548. X70 PRINT CL$; 
  2549. X80 PRINT " Bywater BASIC" 
  2550. X90 INPUT c$ 
  2551. X100 END 
  2552. END_OF_FILE
  2553.   if test 312 -ne `wc -c <'bwbasic-2.10/bwbtest/term.bas'`; then
  2554.     echo shar: \"'bwbasic-2.10/bwbtest/term.bas'\" unpacked with wrong size!
  2555.   fi
  2556.   # end of 'bwbasic-2.10/bwbtest/term.bas'
  2557. fi
  2558. if test -f 'bwbasic-2.10/bwbtest/whilwend.bas' -a "${1}" != "-c" ; then 
  2559.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/whilwend.bas'\"
  2560. else
  2561.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/whilwend.bas'\" \(239 characters\)
  2562.   sed "s/^X//" >'bwbasic-2.10/bwbtest/whilwend.bas' <<'END_OF_FILE'
  2563. X10 REM WHILWEND.BAS -- Test WHILE-WEND Loops
  2564. X20 PRINT "START" 
  2565. X30 LET X = 0 
  2566. X40 WHILE X < 25 
  2567. X50 PRINT "x is ";X 
  2568. X60 LET X = X + 1 
  2569. X70 LET Y = 0 
  2570. X80 WHILE Y < 2 
  2571. X90 PRINT "y is "; Y 
  2572. X100 LET Y = Y + 1 
  2573. X110 WEND 
  2574. X120 WEND 
  2575. X130 PRINT "END" 
  2576. END_OF_FILE
  2577.   if test 239 -ne `wc -c <'bwbasic-2.10/bwbtest/whilwend.bas'`; then
  2578.     echo shar: \"'bwbasic-2.10/bwbtest/whilwend.bas'\" unpacked with wrong size!
  2579.   fi
  2580.   # end of 'bwbasic-2.10/bwbtest/whilwend.bas'
  2581. fi
  2582. if test -f 'bwbasic-2.10/bwbtest/width.bas' -a "${1}" != "-c" ; then 
  2583.   echo shar: Will not clobber existing file \"'bwbasic-2.10/bwbtest/width.bas'\"
  2584. else
  2585.   echo shar: Extracting \"'bwbasic-2.10/bwbtest/width.bas'\" \(206 characters\)
  2586.   sed "s/^X//" >'bwbasic-2.10/bwbtest/width.bas' <<'END_OF_FILE'
  2587. X10 open "o", #1, "data.tmp"
  2588. X20 width #1, 35
  2589. X30 print #1, "123456789012345678901234567890123456789012345678901234567890"
  2590. X40 close #1
  2591. X50 print "Check file <data.tmp> to see if the printing wrapped at col 35"
  2592. END_OF_FILE
  2593.   if test 206 -ne `wc -c <'bwbasic-2.10/bwbtest/width.bas'`; then
  2594.     echo shar: \"'bwbasic-2.10/bwbtest/width.bas'\" unpacked with wrong size!
  2595.   fi
  2596.   # end of 'bwbasic-2.10/bwbtest/width.bas'
  2597. fi
  2598. if test -f 'bwbasic-2.10/configure.in' -a "${1}" != "-c" ; then 
  2599.   echo shar: Will not clobber existing file \"'bwbasic-2.10/configure.in'\"
  2600. else
  2601.   echo shar: Extracting \"'bwbasic-2.10/configure.in'\" \(361 characters\)
  2602.   sed "s/^X//" >'bwbasic-2.10/configure.in' <<'END_OF_FILE'
  2603. Xdnl Process this file with autoconf to produce a configure script.
  2604. XAC_INIT(bwb_cmd.c)
  2605. XAC_PROG_CC
  2606. XAC_PROG_CPP
  2607. XAC_PROG_INSTALL
  2608. XAC_SIZE_T
  2609. XAC_HEADER_CHECK(string.h, AC_DEFINE(HAVE_STRING))
  2610. XAC_HEADER_CHECK(stdlib.h, AC_DEFINE(HAVE_STDLIB))
  2611. XAC_COMPILE_CHECK(raise, [#include <sys/types.h>
  2612. X#include <signal.h>], [raise(1);], AC_DEFINE(HAVE_RAISE))
  2613. XAC_OUTPUT(Makefile)
  2614. END_OF_FILE
  2615.   if test 361 -ne `wc -c <'bwbasic-2.10/configure.in'`; then
  2616.     echo shar: \"'bwbasic-2.10/configure.in'\" unpacked with wrong size!
  2617.   fi
  2618.   # end of 'bwbasic-2.10/configure.in'
  2619. fi
  2620. echo shar: End of archive 10 \(of 15\).
  2621. cp /dev/null ark10isdone
  2622. MISSING=""
  2623. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do
  2624.     if test ! -f ark${I}isdone ; then
  2625.     MISSING="${MISSING} ${I}"
  2626.     fi
  2627. done
  2628. if test "${MISSING}" = "" ; then
  2629.     echo You have unpacked all 15 archives.
  2630.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2631. else
  2632.     echo You still must unpack the following archives:
  2633.     echo "        " ${MISSING}
  2634. fi
  2635. exit 0
  2636. exit 0 # Just in case...
  2637.