Build fix.
[AROS.git] / rom / dos / readitem.c
blobddd009c87b1a9b27243dfcea75a6483b3d41f5f8
1 /*
2 Copyright © 1995-2011, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc:
6 Lang: english
7 */
8 #include <proto/exec.h>
9 #include <dos/rdargs.h>
10 #include <dos/dosasl.h>
11 #include <dos/dosextens.h>
12 #include "dos_intern.h"
14 /*****************************************************************************
16 NAME */
17 #include <proto/dos.h>
19 AROS_LH3(LONG, ReadItem,
21 /* SYNOPSIS */
22 AROS_LHA(STRPTR, buffer, D1),
23 AROS_LHA(LONG, maxchars, D2),
24 AROS_LHA(struct CSource *, input, D3),
26 /* LOCATION */
27 struct DosLibrary *, DOSBase, 135, Dos)
29 /* FUNCTION
30 Read an item from a given character source. Items are words
31 or quoted strings separated by whitespace or '=' just like on
32 the commandline. The separator is unread and the output string
33 is terminated by a NUL character.
35 INPUTS
36 buffer - Buffer to be filled.
37 maxchars - Size of the buffer. Must be at least 1 (for the NUL
38 terminator).
39 input - A ready to use CSource structure or NULL which means
40 "read from the input stream".
42 RESULT
43 One of ITEM_UNQUOTED - Normal word read.
44 ITEM_QUOTED - Quoted string read.
45 ITEM_NOTHING - End of line found. Nothing read.
46 ITEM_EQUAL - '=' read. Buffer is empty.
47 ITEM_ERROR - An error happened. IoErr() gives additional
48 information in that case.
50 NOTES
51 This function handles conversion of '**', '*"', etc inside quotes.
53 EXAMPLE
55 BUGS
57 SEE ALSO
59 INTERNALS
61 *****************************************************************************/
63 AROS_LIBFUNC_INIT
65 /* Macro to get a character from the input source */
66 #define GET(c) \
67 if(input!=NULL) \
68 { \
69 if(input->CS_CurChr>=input->CS_Length) \
70 c=EOF; \
71 else \
72 c=input->CS_Buffer[input->CS_CurChr++]; \
73 }else \
74 { \
75 c=FGetC(Input()); \
76 if(c==EOF && IoErr()) \
77 return ITEM_ERROR; \
80 /* Macro to push the character back */
81 #define UNGET() {if(input!=NULL) input->CS_CurChr--; else UnGetC(Input(),-1);}
83 STRPTR b=buffer;
84 LONG c;
86 /* Skip leading whitespace characters */
89 GET(c);
90 } while (c==' '||c=='\t');
92 if(!c||c=='\n'||c==EOF||c==';')
94 *b=0;
95 return ITEM_NOTHING;
96 }else if(c=='=')
98 /* Found '='. Return it. */
99 *b=0;
100 return ITEM_EQUAL;
101 }else if(c=='\"')
102 /* Quoted item found. Convert Contents. */
103 for(;;)
105 if(!maxchars)
107 *buffer=0;
108 SetIoErr(ERROR_BUFFER_OVERFLOW);
109 return ITEM_ERROR;
111 maxchars--;
112 GET(c);
113 /* Convert ** to *, *" to ", *n to \n and *e to 0x1b. */
114 if(c=='*')
116 GET(c);
117 /* Check for premature end of line. */
118 if(!c||c=='\n'||c==EOF)
120 if(c!=EOF)
121 UNGET();
122 *buffer=0;
123 SetIoErr(ERROR_UNMATCHED_QUOTES);
124 return ITEM_ERROR;
125 }else if(c=='n'||c=='N')
126 c='\n';
127 else if(c=='e'||c=='E')
128 c=0x1b;
129 }else if(!c||c=='\n'||c==EOF)
131 if(c!=EOF)
132 UNGET();
133 *buffer=0;
134 SetIoErr(ERROR_UNMATCHED_QUOTES);
135 return ITEM_ERROR;
136 }else if(c=='\"')
138 /* " ends the item. */
139 *b=0;
140 return ITEM_QUOTED;
142 *b++=c;
144 else
146 /* Unquoted item. Store first character. */
147 if(!maxchars)
149 *buffer=0;
150 SetIoErr(ERROR_BUFFER_OVERFLOW);
151 return ITEM_ERROR;
153 maxchars--;
154 *b++=c;
155 /* Read up to the next terminator. */
156 for(;;)
158 if(!maxchars)
160 *buffer=0;
161 SetIoErr(ERROR_BUFFER_OVERFLOW);
162 return ITEM_ERROR;
164 maxchars--;
165 GET(c);
166 /* Check for terminator */
167 if(!c||c==' '||c=='\t'||c=='\n'||c=='='||c==EOF)
169 if(c!=EOF)
170 UNGET();
171 *b=0;
172 return ITEM_UNQUOTED;
174 *b++=c;
177 AROS_LIBFUNC_EXIT
178 } /* ReadItem */