1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  *
21  */
22 
23 #include "glk/tads/tads2/lib.h"
24 #include "glk/tads/tads2/run.h"
25 #include "glk/tads/tads2/vocabulary.h"
26 #include "glk/tads/os_frob_tads.h"
27 
28 namespace Glk {
29 namespace TADS {
30 namespace TADS2 {
31 
32 
33 /*
34  *  Globals for the script reader
35  */
36 osfildef *scrfp = (osfildef *)0;                             /* script file */
37 int scrquiet = 0;             /* flag: true ==> script is NOT shown as read */
38 
qasopn(char * scrnam,int quiet)39 int qasopn(char *scrnam, int quiet) {
40 	if (scrfp) return 1;                     /* already reading from script */
41 	if ((scrfp = osfoprt(scrnam, OSFTCMD)) == 0) return 1;
42 	scrquiet = quiet;
43 	return 0;
44 }
45 
qasclose()46 void qasclose() {
47 	/* only close the script file if there's one open */
48 	if (scrfp)
49 	{
50 		osfcls(scrfp);
51 		scrfp = 0;                                   /* no more script file */
52 		scrquiet = 0;
53 	}
54 }
55 
qasgets(char * buf,int bufl)56 char *qasgets(char *buf, int bufl) {
57 	/* shouldn't be here at all if there's no script file */
58 	if (scrfp == 0)
59 		return 0;
60 
61 	/* update status line */
62 	runstat();
63 
64 	/* keep going until we find something we like */
65 	for (;;)
66 	{
67 		char c;
68 
69 		/*
70 		 *   Read the next character of input.  If it's not a newline,
71 		 *   there's more on the same line, so read the rest and see what
72 		 *   to do.
73 		 */
74 		c = osfgetc(scrfp);
75 		if (c != '\n' && c != '\r')
76 		{
77 			/* read the rest of the line */
78 			if (!osfgets(buf, bufl, scrfp))
79 			{
80 				/* end of file:  close the script and return eof */
81 				qasclose();
82 				return 0;
83 			}
84 
85 			/* if the line started with '>', strip '\n' and return line */
86 			if (c == '>')
87 			{
88 				int l;
89 
90 				/* remove the trailing newline */
91 				if ((l = strlen(buf)) > 0
92 					&& (buf[l-1] == '\n' || buf[l-1] == '\r'))
93 					buf[l-1] = 0;
94 
95 				/*
96 				 *   if we're not in quiet mode, echo the command to the
97 				 *   display
98 				 */
99 				if (!scrquiet)
100 					outformat(buf);
101 
102 				/* flush the current line without adding any blank lines */
103 				outflushn(1);
104 
105 				/* return the command */
106 				return buf;
107 			}
108 		} else if ((int)c == EOF) {
109 			/* end of file - close the script and return eof */
110 			qasclose();
111 			return 0;
112 		}
113 	}
114 }
115 
116 } // End of namespace TADS2
117 } // End of namespace TADS
118 } // End of namespace Glk
119