aboutsummaryrefslogtreecommitdiffstats
path: root/bwb_dio.c
diff options
context:
space:
mode:
Diffstat (limited to 'bwb_dio.c')
-rw-r--r--bwb_dio.c1281
1 files changed, 1281 insertions, 0 deletions
diff --git a/bwb_dio.c b/bwb_dio.c
new file mode 100644
index 0000000..4affd33
--- /dev/null
+++ b/bwb_dio.c
@@ -0,0 +1,1281 @@
+/***************************************************************
+
+ bwb_dio.c Device Input/Output Routines
+ for Bywater BASIC Interpreter
+
+ Copyright (c) 1993, Ted A. Campbell
+ Bywater Software
+
+ email: tcamp@delphi.com
+
+ Copyright and Permissions Information:
+
+ All U.S. and international rights are claimed by the author,
+ Ted A. Campbell.
+
+ This software is released under the terms of the GNU General
+ Public License (GPL), which is distributed with this software
+ in the file "COPYING". The GPL specifies the terms under
+ which users may copy and use the software in this distribution.
+
+ A separate license is available for commercial distribution,
+ for information on which you should contact the author.
+
+***************************************************************/
+
+/*---------------------------------------------------------------*/
+/* NOTE: Modifications marked "JBV" were made by Jon B. Volkoff, */
+/* 11/1995 (eidetics@cerf.net). */
+/* */
+/* Those additionally marked with "DD" were at the suggestion of */
+/* Dale DePriest (daled@cadence.com). */
+/* */
+/* Version 3.00 by Howard Wulf, AF5NE */
+/* */
+/* Version 3.10 by Howard Wulf, AF5NE */
+/* */
+/* Version 3.20 by Howard Wulf, AF5NE */
+/* */
+/*---------------------------------------------------------------*/
+
+
+
+#include "bwbasic.h"
+
+
+static LineType *C77_OPEN (LineType * l);
+static LineType *D71_OPEN (LineType * l);
+static LineType *H80_OPEN (LineType * l);
+static LineType *M80_OPEN (LineType * l);
+static LineType *S70_OPEN (LineType * l);
+static LineType *T79_OPEN (LineType * l);
+
+
+/***************************************************************
+
+ FUNCTION: bwb_open()
+
+ DESCRIPTION: This function implements the BASIC OPEN
+ command to open a stream for device input/output.
+
+ SYNTAX: 1. OPEN "I"|"O"|"R"|"A", [#]n, filename [,rlen]
+ 2. OPEN filename [FOR INPUT|OUTPUT|APPEND|RANDOM|BINARY] AS [#]n [LEN=n]
+
+***************************************************************/
+
+extern void
+bwb_file_open (char A, int x, char *B, int y)
+{
+ /* OPEN "I"|"O"|"R"|"A", [#] filenum, filename [,reclen] */
+ /* P1STR|P2NUM|P3STR|P4NUM */
+ /* P1BYT|P2DEV|P3BYT|P4INT */
+ int mode;
+ FileType *F;
+ FILE *fp;
+ char *buffer;
+
+ assert (B != NULL);
+ assert(My != NULL);
+ assert(My->CurrentVersion != NULL);
+ assert(My->SYSIN != NULL);
+ assert(My->SYSOUT != NULL);
+ assert(My->SYSPRN != NULL);
+
+ mode = 0;
+ F = NULL;
+ fp = NULL;
+ buffer = NULL;
+ if (y < 0)
+ {
+ WARN_FIELD_OVERFLOW;
+ return;
+ }
+
+ mode = bwb_toupper (A);
+ switch (mode)
+ {
+ case 'I':
+ case 'O':
+ case 'A':
+ case 'B':
+ case 'V':
+ case 'R':
+ /* valid mode */
+ break;
+ default:
+ WARN_BAD_FILE_MODE;
+ return;
+ }
+ /* valid mode */
+ F = find_file_by_number (x);
+ if (F == NULL)
+ {
+ F = file_new ();
+ if (F == NULL)
+ {
+ WARN_OUT_OF_MEMORY;
+ return;
+ }
+ }
+ if (F == My->SYSIN)
+ {
+ WARN_BAD_FILE_NUMBER;
+ return;
+ }
+ if (F == My->SYSOUT)
+ {
+ WARN_BAD_FILE_NUMBER;
+ return;
+ }
+ if (F == My->SYSPRN)
+ {
+ WARN_BAD_FILE_NUMBER;
+ return;
+ }
+ if (F->DevMode != DEVMODE_CLOSED)
+ {
+ WARN_BAD_FILE_NUMBER;
+ return;
+ }
+ /* valid filenumber */
+ switch (mode)
+ {
+ case 'I':
+ mode = DEVMODE_INPUT;
+ fp = fopen (B, "r");
+ if (fp == NULL)
+ {
+ WARN_BAD_FILE_NAME;
+ return;
+ }
+ if (y > 0)
+ {
+ /* RECLEN == INPUT BUFFER SIZE */
+ if ((buffer =
+ (char *) calloc (y + 1 /* NulChar */ , sizeof (char))) == NULL)
+ {
+ WARN_OUT_OF_MEMORY;
+ return;
+ }
+ bwb_memset (buffer, ' ', y); /* flush */
+ buffer[y] = NulChar;
+ }
+ break;
+ case 'O':
+ mode = DEVMODE_OUTPUT;
+ fp = fopen (B, "w");
+ if (fp == NULL)
+ {
+ WARN_BAD_FILE_NAME;
+ return;
+ }
+ if (y > 0)
+ {
+ /* RECLEN == OUTPUT WRAP WIDTH */
+ }
+ break;
+ case 'A':
+ mode = DEVMODE_APPEND;
+ fp = fopen (B, "a");
+ if (fp == NULL)
+ {
+ WARN_BAD_FILE_NAME;
+ return;
+ }
+ fseek (fp, 0, SEEK_END);
+ if (y > 0)
+ {
+ /* RECLEN == OUTPUT WRAP WIDTH */
+ }
+ break;
+ case 'B':
+ mode = DEVMODE_BINARY;
+ fp = fopen (B, "r+");
+ if (fp == NULL)
+ {
+ fp = fopen (B, "w");
+ if (fp != NULL)
+ {
+ bwb_fclose (fp);
+ fp = fopen (B, "r+");
+ }
+ }
+ if (fp == NULL)
+ {
+ WARN_BAD_FILE_NAME;
+ return;
+ }
+ if (y > 0)
+ {
+ /* RECLEN == SILENTLY IGNORED */
+ }
+ break;
+ case 'V':
+ mode = DEVMODE_VIRTUAL;
+ fp = fopen (B, "r+");
+ if (fp == NULL)
+ {
+ fp = fopen (B, "w");
+ if (fp != NULL)
+ {
+ bwb_fclose (fp);
+ fp = fopen (B, "r+");
+ }
+ }
+ if (fp == NULL)
+ {
+ WARN_BAD_FILE_NAME;
+ return;
+ }
+ if (y > 0)
+ {
+ /* RECLEN == SILENTLY IGNORED */
+ }
+ break;
+ case 'R':
+ if (y == 0)
+ {
+ /* dialect-specific default record length */
+ y = My->CurrentVersion->OptionReclenInteger;
+ if (y == 0)
+ {
+ /* there is no default record length */
+ WARN_FIELD_OVERFLOW;
+ return;
+ }
+ }
+ mode = DEVMODE_RANDOM;
+ fp = fopen (B, "r+");
+ if (fp == NULL)
+ {
+ fp = fopen (B, "w");
+ if (fp != NULL)
+ {
+ bwb_fclose (fp);
+ fp = fopen (B, "r+");
+ }
+ }
+ if (fp == NULL)
+ {
+ WARN_BAD_FILE_NAME;
+ return;
+ }
+ if (y > 0)
+ {
+ /* RECLEN == RANDOM BUFFER SIZE */
+ if ((buffer = (char *) calloc (y, sizeof (char))) == NULL)
+ {
+ WARN_OUT_OF_MEMORY;
+ return;
+ }
+ bwb_memset (buffer, ' ', y); /* flush */
+ }
+ break;
+ default:
+ /* should not happen */
+ WARN_BAD_FILE_MODE;
+ return;
+ }
+ /* OK */
+ F->FileNumber = x;
+ F->DevMode = mode;
+ F->cfp = fp;
+ F->width = y; /* WIDTH == RECLEN */
+ F->col = 1;
+ F->row = 1;
+ F->delimit = ',';
+ if (F->buffer != NULL)
+ {
+ free (F->buffer);
+ F->buffer = NULL;
+ }
+ F->buffer = buffer;
+ if (F->FileName != NULL)
+ {
+ free (F->FileName);
+ F->FileName = NULL;
+ }
+ F->FileName = bwb_strdup (B); /* 'B' is free'd by caller */
+ return;
+}
+
+
+
+static LineType *
+C77_OPEN (LineType * l)
+{
+ int FileNumber;
+ int RecordLength;
+ char *FileName;
+
+ assert (l != NULL);
+ assert(My != NULL);
+
+ FileNumber = 0;
+ RecordLength = 0;
+ FileName = NULL;
+ /*
+ SYNTAX: OPEN filename$ [ RECL reclen ] AS filenumber [ BUFF ignored ] [ RECS ignored ]
+ */
+
+ /*
+ ---------------------------------------------
+ FILE NAME
+ ---------------------------------------------
+ */
+ if (line_read_string_expression (l, &FileName) == FALSE)
+ {
+ WARN_BAD_FILE_NAME;
+ return (l);
+ }
+ if (FileName == NULL)
+ {
+ WARN_BAD_FILE_NAME;
+ return (l);
+ }
+ if (is_empty_string (FileName))
+ {
+ WARN_BAD_FILE_NAME;
+ return (l);
+ }
+ /*
+ ---------------------------------------------
+ RECORD LENGTH
+ ---------------------------------------------
+ */
+ if (line_skip_word (l, "RECL"))
+ {
+ if (line_read_integer_expression (l, &RecordLength) == FALSE)
+ {
+ WARN_FIELD_OVERFLOW;
+ return (l);
+ }
+ if (RecordLength <= 0)
+ {
+ WARN_FIELD_OVERFLOW;
+ return (l);
+ }
+ }
+ /*
+ ---------------------------------------------
+ FILE NUMBER
+ ---------------------------------------------
+ */
+ if (line_skip_word (l, "AS") == FALSE)
+ {
+ WARN_SYNTAX_ERROR;
+ return (l);
+ }
+ if (line_skip_FilenumChar (l))
+ {
+ /* OPTIONAL */
+ }
+ if (line_read_integer_expression (l, &FileNumber) == FALSE)
+ {
+ WARN_BAD_FILE_NUMBER;
+ return (l);
+ }
+ if (FileNumber <= 0)
+ {
+ WARN_BAD_FILE_NUMBER;
+ return (l);
+ }
+ /*
+ ---------------------------------------------
+ IGNORED
+ ---------------------------------------------
+ */
+ /* if( TRUE ) */
+ {
+ int Ignored;
+
+ Ignored = 0;
+ /*
+ these are all parsed but ignored
+ */
+
+ if (line_skip_word (l, "BUFF"))
+ {
+ if (line_read_integer_expression (l, &Ignored) == FALSE)
+ {
+ WARN_ILLEGAL_FUNCTION_CALL;
+ return (l);
+ }
+ if (Ignored <= 0)
+ {
+ WARN_ILLEGAL_FUNCTION_CALL;
+ return (l);
+ }
+ }
+ if (line_skip_word (l, "RECS"))
+ {
+ if (line_read_integer_expression (l, &Ignored) == FALSE)
+ {
+ WARN_ILLEGAL_FUNCTION_CALL;
+ return (l);
+ }
+ if (Ignored <= 0)
+ {
+ WARN_ILLEGAL_FUNCTION_CALL;
+ return (l);
+ }
+ }
+ }
+ /*
+ ---------------------------------------------
+ FILE MODE
+ ---------------------------------------------
+ */
+ /*
+ ---------------------------------------------
+ DO IT
+ ---------------------------------------------
+ */
+ My->CurrentFile = find_file_by_number (FileNumber);
+ if (My->CurrentFile == NULL)
+ {
+ My->CurrentFile = file_new ();
+ My->CurrentFile->FileNumber = FileNumber;
+ }
+ if (My->CurrentFile->FileName != NULL)
+ {
+ free (My->CurrentFile->FileName);
+ My->CurrentFile->FileName = NULL;
+ }
+ My->CurrentFile->FileName = FileName;
+ FileName = NULL;
+ if (My->CurrentFile->DevMode != DEVMODE_CLOSED)
+ {
+ My->CurrentFile->DevMode = DEVMODE_CLOSED;
+ }
+ if (My->CurrentFile->cfp != NULL)
+ {
+ bwb_fclose (My->CurrentFile->cfp);
+ My->CurrentFile->cfp = NULL;
+ }
+ if (My->CurrentFile->buffer != NULL)
+ {
+ free (My->CurrentFile->buffer);
+ My->CurrentFile->buffer = NULL;
+ }
+ My->CurrentFile->width = 0;
+ My->CurrentFile->col = 1;
+ My->CurrentFile->row = 1;
+ My->CurrentFile->delimit = ',';
+ /* open EXISTING text file for update (reading and writing) */
+ if (is_empty_string (My->CurrentFile->FileName))
+ {
+ WARN_BAD_FILE_NAME;
+ return (l);
+ }
+ if ((My->CurrentFile->cfp =
+ fopen (My->CurrentFile->FileName, "r+")) == NULL)
+ {
+ /* IF END # file_number THEN line_number */
+ if (My->CurrentFile->EOF_LineNumber > 0)
+ {
+ LineType *x;
+
+ x = find_line_number (My->CurrentFile->EOF_LineNumber); /* not found in the cache */
+ if (x != NULL)
+ {
+ /* FOUND */
+ line_skip_eol (l);
+ x->position = 0;
+ free (FileName);
+ FileName = NULL;
+ return x;
+ }
+ /* NOT FOUND */
+ WARN_UNDEFINED_LINE;
+ return (l);
+ }
+ WARN_BAD_FILE_NAME;
+ return (l);
+ }
+ if (RecordLength > 0)
+ {
+ My->CurrentFile->width = RecordLength; /* includes the terminating '\n' */
+ My->CurrentFile->DevMode = DEVMODE_RANDOM;
+ if ((My->CurrentFile->buffer =
+ (char *) calloc (RecordLength, sizeof (char))) == NULL)
+ {
+ WARN_OUT_OF_MEMORY;
+ return (l);
+ }
+ bwb_memset (My->CurrentFile->buffer, ' ', RecordLength); /* flush */
+ }
+ else
+ {
+ My->CurrentFile->DevMode = DEVMODE_INPUT | DEVMODE_OUTPUT;
+ }
+ /* OK */
+ free (FileName);
+ FileName = NULL;
+ return (l);
+}
+
+static LineType *
+S70_OPEN (LineType * l)
+{
+ int FileNumber;
+ char FileMode;
+ int RecordLength;
+ char *FileName;
+
+ assert (l != NULL);
+
+ FileNumber = 0;
+ FileMode = 'R';
+ RecordLength = 0;
+ FileName = NULL;
+ /*
+ SYNTAX: OPEN filenumber, filename$, INPUT | OUTPUT | APPEND | VIRTUAL
+ */
+ /*
+ ---------------------------------------------
+ FILE NUMBER
+ ---------------------------------------------
+ */
+ if (line_skip_FilenumChar (l))
+ {
+ /* OPTIONAL */
+ }
+ if (line_read_integer_expression (l, &FileNumber) == FALSE)
+ {
+ WARN_BAD_FILE_NUMBER;
+ return (l);
+ }
+ if (FileNumber <= 0)
+ {
+ WARN_BAD_FILE_NUMBER;
+ return (l);
+ }
+ if (line_skip_seperator (l) == FALSE)
+ {
+ WARN_SYNTAX_ERROR;
+ return (l);
+ }
+ /*
+ ---------------------------------------------
+ FILE NAME
+ ---------------------------------------------
+ */
+ if (line_read_string_expression (l, &FileName) == FALSE)
+ {
+ WARN_BAD_FILE_NAME;
+ return (l);
+ }
+ if (FileName == NULL)
+ {
+ WARN_BAD_FILE_NAME;
+ return (l);
+ }
+ if (is_empty_string (FileName))
+ {
+ WARN_BAD_FILE_NAME;
+ return (l);
+ }
+ if (line_skip_seperator (l) == FALSE)
+ {
+ WARN_SYNTAX_ERROR;
+ return (l);
+ }
+ /*
+ ---------------------------------------------
+ FILE MODE
+ ---------------------------------------------
+ */
+ /* if( TRUE ) */
+ {
+ if (line_skip_word (l, "INPUT"))
+ {
+ FileMode = 'I';
+ }
+ else if (line_skip_word (l, "OUTPUT"))
+ {
+ FileMode = 'O';
+ }
+ else if (line_skip_word (l, "APPEND"))
+ {
+ FileMode = 'A';
+ }
+ else if (line_skip_word (l, "VIRTUAL"))
+ {
+ FileMode = 'V';
+ }
+ else
+ {
+ WARN_BAD_FILE_MODE;
+ return (l);
+ }
+ }
+ /*
+ ---------------------------------------------
+ RECORD LENGTH
+ ---------------------------------------------
+ */
+ RecordLength = 0;
+ /*
+ ---------------------------------------------
+ DO IT
+ ---------------------------------------------
+ */
+ bwb_file_open (FileMode, FileNumber, FileName, RecordLength);
+ free (FileName);
+ FileName = NULL;
+ return (l);
+}
+
+static LineType *
+D71_OPEN (LineType * l)
+{
+ int FileNumber;
+ char FileMode;
+ int RecordLength;
+ char *FileName;
+
+ assert (l != NULL);
+
+ FileNumber = 0;
+ FileMode = 'R';
+ RecordLength = 0;
+ FileName = NULL;
+ /*
+ SYNTAX: OPEN filename$ [FOR mode] AS FILE filenumber [ ,RECORDSIZE ignored ] [ ,CLUSTERSIZE ignored ] [ ,MODE ignored ]
+ */
+ /*
+ ---------------------------------------------
+ FILE NAME
+ ---------------------------------------------
+ */
+ if (line_read_string_expression (l, &FileName) == FALSE)
+ {
+ WARN_BAD_FILE_NAME;
+ return (l);
+ }
+ if (FileName == NULL)
+ {
+ WARN_BAD_FILE_NAME;
+ return (l);
+ }
+ if (is_empty_string (FileName))
+ {
+ WARN_BAD_FILE_NAME;
+ return (l);
+ }
+ /*
+ ---------------------------------------------
+ FILE MODE
+ ---------------------------------------------
+ */
+ if (line_skip_word (l, "FOR"))
+ {
+ if (line_skip_word (l, "INPUT"))
+ {
+ FileMode = 'I';
+ }
+ else if (line_skip_word (l, "OUTPUT"))
+ {
+ FileMode = 'O';
+ }
+ else if (line_skip_word (l, "APPEND"))
+ {
+ FileMode = 'A';
+ }
+ else if (line_skip_word (l, "RANDOM"))
+ {
+ FileMode = 'R';
+ }
+ else if (line_skip_word (l, "BINARY"))
+ {
+ FileMode = 'B';
+ }
+ else if (line_skip_word (l, "VIRTUAL"))
+ {
+ FileMode = 'V';
+ }
+ else
+ {
+ WARN_BAD_FILE_MODE;
+ return (l);
+ }
+ }
+ /*
+ ---------------------------------------------
+ FILE NUMBER
+ ---------------------------------------------
+ */
+ if (line_skip_word (l, "AS") == FALSE)
+ {
+ WARN_SYNTAX_ERROR;
+ return (l);
+ }
+ if (line_skip_word (l, "FILE") == FALSE)
+ {
+ WARN_SYNTAX_ERROR;
+ return (l);
+ }
+ if (line_skip_FilenumChar (l))
+ {
+ /* OPTIONAL */
+ }
+ if (line_read_integer_expression (l, &FileNumber) == FALSE)
+ {
+ WARN_BAD_FILE_NUMBER;
+ return (l);
+ }
+ if (FileNumber <= 0)
+ {
+ WARN_BAD_FILE_NUMBER;
+ return (l);
+ }
+ /*
+ ---------------------------------------------
+ RECORD LENGTH
+ ---------------------------------------------
+ */
+ RecordLength = 0;
+ while (line_is_eol (l) == FALSE)
+ {
+ int Ignored;
+
+ Ignored = 0;
+ /*
+ these are all parsed but ignored
+ */
+ if (line_skip_seperator (l))
+ {
+ /* OK */
+ }
+ else if (line_skip_word (l, "RECORDSIZE"))
+ {
+ if (line_read_integer_expression (l, &Ignored) == FALSE)
+ {
+ WARN_SYNTAX_ERROR;
+ return (l);
+ }
+ }
+ else if (line_skip_word (l, "CLUSTERSIZE"))
+ {
+ if (line_read_integer_expression (l, &Ignored) == FALSE)
+ {
+ WARN_SYNTAX_ERROR;
+ return (l);
+ }
+ }
+ else if (line_skip_word (l, "FILESIZE"))
+ {
+ if (line_read_integer_expression (l, &Ignored) == FALSE)
+ {
+ WARN_SYNTAX_ERROR;
+ return (l);
+ }
+ }
+ else if (line_skip_word (l, "MODE"))
+ {
+ if (line_read_integer_expression (l, &Ignored) == FALSE)
+ {
+ WARN_SYNTAX_ERROR;
+ return (l);
+ }
+ }
+ else
+ {
+ WARN_SYNTAX_ERROR;
+ return (l);
+ }
+ }
+ /*
+ ---------------------------------------------
+ DO IT
+ ---------------------------------------------
+ */
+ bwb_file_open (FileMode, FileNumber, FileName, RecordLength);
+ free (FileName);
+ FileName = NULL;
+ return (l);
+}
+
+static LineType *
+H80_OPEN (LineType * l)
+{
+ int FileNumber;
+ char FileMode;
+ int RecordLength;
+ char *FileName;
+
+ assert (l != NULL);
+
+ FileNumber = 0;
+ FileMode = 'R';
+ RecordLength = 0;
+ FileName = NULL;
+ /*
+ SYNTAX: OPEN filename$ FOR mode AS FILE filenumber
+ */
+ /*
+ ---------------------------------------------
+ FILE NAME
+ ---------------------------------------------
+ */
+ if (line_read_string_expression (l, &FileName) == FALSE)
+ {
+ WARN_BAD_FILE_NAME;
+ return (l);
+ }
+ if (FileName == NULL)
+ {
+ WARN_BAD_FILE_NAME;
+ return (l);
+ }
+ if (is_empty_string (FileName))
+ {
+ WARN_BAD_FILE_NAME;
+ return (l);
+ }
+ /*
+ ---------------------------------------------
+ FILE MODE
+ ---------------------------------------------
+ */
+ if (line_skip_word (l, "FOR") == FALSE)
+ {
+ WARN_SYNTAX_ERROR;
+ return (l);
+ }
+ if (line_skip_word (l, "READ"))
+ {
+ FileMode = 'I';
+ }
+ else if (line_skip_word (l, "WRITE"))
+ {
+ FileMode = 'O';
+ }
+ else if (line_skip_word (l, "VIRTUAL"))
+ {
+ FileMode = 'V';
+ }
+ else
+ {
+ WARN_BAD_FILE_MODE;
+ return (l);
+ }
+ /*
+ ---------------------------------------------
+ FILE NUMBER
+ ---------------------------------------------
+ */
+ if (line_skip_word (l, "AS") == FALSE)
+ {
+ WARN_SYNTAX_ERROR;
+ return (l);
+ }
+ if (line_skip_word (l, "FILE") == FALSE)
+ {
+ WARN_SYNTAX_ERROR;
+ return (l);
+ }
+ if (line_skip_FilenumChar (l))
+ {
+ /* OPTIONAL */
+ }
+ if (line_read_integer_expression (l, &FileNumber) == FALSE)
+ {
+ WARN_BAD_FILE_NUMBER;
+ return (l);
+ }
+ if (FileNumber <= 0)
+ {
+ WARN_BAD_FILE_NUMBER;
+ return (l);
+ }
+ /*
+ ---------------------------------------------
+ RECORD LENGTH
+ ---------------------------------------------
+ */
+ RecordLength = 0;
+ /*
+ ---------------------------------------------
+ DO IT
+ ---------------------------------------------
+ */
+ bwb_file_open (FileMode, FileNumber, FileName, RecordLength);
+ free (FileName);
+ FileName = NULL;
+ return (l);
+}
+
+
+static LineType *
+M80_OPEN (LineType * l)
+{
+ int FileNumber;
+ char FileMode;
+ int RecordLength;
+ char *FileName;
+
+ assert (l != NULL);
+ assert(My != NULL);
+ assert(My->CurrentVersion != NULL);
+
+ FileNumber = 0;
+ FileMode = 'R';
+ RecordLength = 0;
+ FileName = NULL;
+ /*
+ SYNTAX: OPEN filename$ [FOR mode] AS filenumber [LEN reclen]
+ */
+ /*
+ ---------------------------------------------
+ FILE NAME
+ ---------------------------------------------
+ */
+ if (line_read_string_expression (l, &FileName) == FALSE)
+ {
+ WARN_BAD_FILE_NAME;
+ return (l);
+ }
+ if (FileName == NULL)
+ {
+ WARN_BAD_FILE_NAME;
+ return (l);
+ }
+ if (is_empty_string (FileName))
+ {
+ WARN_BAD_FILE_NAME;
+ return (l);
+ }
+ /*
+ ---------------------------------------------
+ FILE MODE
+ ---------------------------------------------
+ */
+ if (line_skip_word (l, "FOR"))
+ {
+ if (line_skip_word (l, "INPUT"))
+ {
+ FileMode = 'I';
+ }
+ else if (line_skip_word (l, "OUTPUT"))
+ {
+ FileMode = 'O';
+ }
+ else if (line_skip_word (l, "APPEND"))
+ {
+ FileMode = 'A';
+ }
+ else if (line_skip_word (l, "RANDOM"))
+ {
+ FileMode = 'R';
+ }
+ else if (line_skip_word (l, "BINARY"))
+ {
+ FileMode = 'B';
+ }
+ else if (line_skip_word (l, "VIRTUAL"))
+ {
+ FileMode = 'V';
+ }
+ else
+ {
+ WARN_BAD_FILE_MODE;
+ return (l);
+ }
+ }
+
+ if (My->CurrentVersion->OptionVersionValue & (H14))
+ {
+ /*
+ **
+ ** these are parsed but ignored
+ **
+ */
+ if (line_skip_word (l, "ACCESS"))
+ {
+ /* ACCESS */
+ if (line_skip_word (l, "READ"))
+ {
+ /* ACCESS READ */
+ if (line_skip_word (l, "WRITE"))
+ {
+ /* ACCESS READ WRITE */
+ }
+ }
+ else if (line_skip_word (l, "WRITE"))
+ {
+ /* ACCESS WRITE */
+ }
+ }
+ if (line_skip_word (l, "SHARED"))
+ {
+ /* SHARED */
+ }
+ else if (line_skip_word (l, "LOCK"))
+ {
+ /* LOCK */
+ if (line_skip_word (l, "READ"))
+ {
+ /* LOCK READ */
+ }
+ else if (line_skip_word (l, "WRITE"))
+ {
+ /* LOCK WRITE */
+ }
+ }
+ }
+ /*
+ ---------------------------------------------
+ FILE NUMBER
+ ---------------------------------------------
+ */
+ if (line_skip_word (l, "AS") == FALSE)
+ {
+ WARN_SYNTAX_ERROR;
+ return (l);
+ }
+ if (My->CurrentVersion->OptionVersionValue & (H14))
+ {
+ if (line_skip_word (l, "FILE"))
+ {
+ /* OPTIONAL */
+ }
+ }
+
+ if (line_skip_FilenumChar (l))
+ {
+ /* OPTIONAL */
+ }
+ if (line_read_integer_expression (l, &FileNumber) == FALSE)
+ {
+ WARN_BAD_FILE_NUMBER;
+ return (l);
+ }
+ if (FileNumber <= 0)
+ {
+ WARN_BAD_FILE_NUMBER;
+ return (l);
+ }
+ /*
+ ---------------------------------------------
+ RECORD LENGTH
+ ---------------------------------------------
+ */
+ RecordLength = 0;
+ if (line_skip_word (l, "LEN"))
+ {
+ if (line_skip_EqualChar (l))
+ {
+ /* OPTIONAL */
+ }
+ if (line_read_integer_expression (l, &RecordLength) == FALSE)
+ {
+ WARN_FIELD_OVERFLOW;
+ return (l);
+ }
+ if (RecordLength <= 0)
+ {
+ WARN_FIELD_OVERFLOW;
+ return (l);
+ }
+ }
+ /*
+ ---------------------------------------------
+ DO IT
+ ---------------------------------------------
+ */
+ bwb_file_open (FileMode, FileNumber, FileName, RecordLength);
+ free (FileName);
+ FileName = NULL;
+ return (l);
+}
+
+static LineType *
+T79_OPEN (LineType * l)
+{
+ int FileNumber;
+ char FileMode;
+ int RecordLength;
+ char *FileName;
+
+ assert (l != NULL);
+
+ FileNumber = 0;
+ FileMode = 'R';
+ RecordLength = 0;
+ FileName = NULL;
+ /*
+ SYNTAX: OPEN [NEW | OLD] filename$ AS filenumber
+ */
+ /*
+ ---------------------------------------------
+ FILE MODE
+ ---------------------------------------------
+ */
+ if (line_skip_word (l, "NEW"))
+ {
+ FileMode = 'O';
+ }
+ else if (line_skip_word (l, "OLD"))
+ {
+ FileMode = 'I';
+ }
+ else if (line_skip_word (l, "VIRTUAL"))
+ {
+ FileMode = 'V';
+ }
+ /*
+ ---------------------------------------------
+ FILE NAME
+ ---------------------------------------------
+ */
+ if (line_read_string_expression (l, &FileName) == FALSE)
+ {
+ WARN_BAD_FILE_NAME;
+ return (l);
+ }
+ if (FileName == NULL)
+ {
+ WARN_BAD_FILE_NAME;
+ return (l);
+ }
+ if (is_empty_string (FileName))
+ {
+ WARN_BAD_FILE_NAME;
+ return (l);
+ }
+ /*
+ ---------------------------------------------
+ FILE NUMBER
+ ---------------------------------------------
+ */
+ if (line_skip_word (l, "AS") == FALSE)
+ {
+ WARN_SYNTAX_ERROR;
+ return (l);
+ }
+ if (line_skip_FilenumChar (l))
+ {
+ /* OPTIONAL */
+ }
+ if (line_read_integer_expression (l, &FileNumber) == FALSE)
+ {
+ WARN_BAD_FILE_NUMBER;
+ return (l);
+ }
+ if (FileNumber <= 0)
+ {
+ WARN_BAD_FILE_NUMBER;
+ return (l);
+ }
+ /*
+ ---------------------------------------------
+ RECORD LENGTH
+ ---------------------------------------------
+ */
+ RecordLength = 0;
+ /*
+ ---------------------------------------------
+ DO IT
+ ---------------------------------------------
+ */
+ bwb_file_open (FileMode, FileNumber, FileName, RecordLength);
+ free (FileName);
+ FileName = NULL;
+ return (l);
+}
+
+LineType *
+bwb_OPEN (LineType * l)
+{
+
+ assert (l != NULL);
+ assert(My != NULL);
+ assert(My->CurrentVersion != NULL);
+
+ if (My->CurrentVersion->OptionVersionValue & (S70 | I70 | I73))
+ {
+ return S70_OPEN (l);
+ }
+ if (My->CurrentVersion->OptionVersionValue & (D71))
+ {
+ return D71_OPEN (l);
+ }
+ if (My->CurrentVersion->OptionVersionValue & (C77))
+ {
+ return C77_OPEN (l);
+ }
+ if (My->CurrentVersion->OptionVersionValue & (H80))
+ {
+ return H80_OPEN (l);
+ }
+ if (My->CurrentVersion->OptionVersionValue & (T79 | R86))
+ {
+ return T79_OPEN (l);
+ }
+ /* default */
+ return M80_OPEN (l);
+}
+
+/***************************************************************
+
+ FUNCTION: bwb_name()
+
+ DESCRIPTION: This function implements the BASIC NAME
+ command to rename a disk file.
+
+ SYNTAX: NAME old_filename AS new_filename
+
+***************************************************************/
+
+
+LineType *
+bwb_NAME (LineType * l)
+{
+ char *OldName;
+ char *NewName;
+
+ assert (l != NULL);
+
+ OldName = NULL;
+ NewName = NULL;
+ if (line_read_string_expression (l, &OldName) == FALSE)
+ {
+ WARN_SYNTAX_ERROR;
+ return (l);
+ }
+ if (is_empty_string (OldName))
+ {
+ WARN_BAD_FILE_NAME;
+ return (l);
+ }
+ if (line_skip_word (l, "AS") == FALSE)
+ {
+ WARN_SYNTAX_ERROR;
+ return (l);
+ }
+ if (line_read_string_expression (l, &NewName) == FALSE)
+ {
+ WARN_SYNTAX_ERROR;
+ return (l);
+ }
+ if (is_empty_string (NewName))
+ {
+ WARN_BAD_FILE_NAME;
+ return (l);
+ }
+ /* try to rename the file */
+ if (rename (OldName, NewName) != 0)
+ {
+ WARN_BAD_FILE_NAME;
+ }
+ free (OldName);
+ OldName = NULL;
+ free (NewName);
+ NewName = NULL;
+ return (l);
+}
+
+
+/* EOF */
Un proyecto texto-plano.xyz