2 Copyright © 1995-2001, The AROS Development Team. All rights reserved.
9 /******************************************************************************
17 VALUE1/A,OP,VALUE2/M,TO/K,LFORMAT/K
25 Evaluate an integer expression and print the result. The result is
26 written to standard output if not the TO switch are used which instead
27 prints the result to a file. Using the switch LFORMAT, it is
28 possible to direct how to write the result. Numbers prefixed by
29 0x or #x are interpreted as hexadecimal and those prefixed by # or 0
30 are interpreted as octals. Alphabetical characters are indicated
31 by a leading single quotation mark ('), and are evaluated as their
38 VALUE2 -- The expression to evaluate. The following operators
42 ----------------------------------
54 exclusive or xor, X, x
55 bitwise equivalence eqv, E, e
57 TO -- File to write the result to
58 LFORMAT -- printf-like specification of what to write.
59 The possible swiches are:
61 %x -- hexadecimal output
64 %c -- character output (the ANSI-character
65 corresponding to the result value)
67 By specifying *n in the LFORMAT string, a newline
84 01.01.2001 SDuvan implemented (although a bit tired... happy new year!)
86 ******************************************************************************/
89 #include <aros/debug.h>
91 #include "evalParser.tab.c"
93 #include <exec/types.h>
94 #include <exec/memory.h>
96 #include <dos/dosextens.h>
97 #include <dos/rdargs.h>
98 #include <proto/dos.h>
99 #include <proto/exec.h>
102 static const char version
[] = "$VER: Eval 41.1 (01.01.2001)\n";
104 #define ARG_TEMPLATE "VALUE1/A,OP,VALUE2/M,TO/K,LFORMAT/K"
116 void printLformat(STRPTR format
, int value
);
117 STRPTR
fixExpression(STRPTR val1
, STRPTR op
, STRPTR
*vals
);
124 int retval
= RETURN_FAIL
;
126 IPTR args
[] = { (IPTR
)NULL
,
134 rda
= ReadArgs(ARG_TEMPLATE
, args
, NULL
);
138 STRPTR toFile
= (STRPTR
)args
[ARG_TO
];
139 STRPTR lFormat
= (STRPTR
)args
[ARG_LFORMAT
];
140 STRPTR value1
= (STRPTR
)args
[ARG_VALUE1
];
141 STRPTR op
= (STRPTR
)args
[ARG_OP
];
142 STRPTR
*value2
= (STRPTR
*)args
[ARG_VALUE2
];
146 BPTR oldout
= NULL
; /* Former output stream if using TO */
147 BPTR file
= NULL
; /* Output redirection stream */
149 /* The Amiga Eval command is totally brain-dead and, at the same time,
150 ReadArgs() is not really suitable for these arguments. To be
151 compatible to the Amiga Eval command, we have to patch the arguments
152 together to get something useful out of this. */
153 argString
= fixExpression(value1
, op
, value2
);
155 text
= argString
; /* Note: text is a global variable that is
156 modified, so we cannot free 'text' below */
158 D(bug("Put together text: %s\n", text
));
160 if (text
== NULL
|| yyparse() == 1)
172 file
= Open(toFile
, MODE_NEWFILE
);
176 oldout
= SelectOutput(file
);
180 printf("Cannot open output file %s\n", toFile
);
189 printLformat(lFormat
, g_result
);
193 printf("%i\n", g_result
);
196 /* Reinstall output stream if we changed it */
199 SelectOutput(oldout
);
201 /* Close the TO/K file */
207 PrintFault(IoErr(), "Eval");
217 extern int g_result
; /* The result variable is global for now */
219 void printLformat(STRPTR format
, int value
)
221 ULONG i
; /* Loop variable */
223 /* If it weren't for *n we could use VfWriteF() */
225 for (i
= 0; format
[i
] != 0; i
++)
230 if (format
[i
] == 'n')
244 switch (tolower(format
[i
]))
246 /* Hexadecimal display */
256 /* Integer display */
261 /* Character display */
270 /* Stupid user writes "...%" */
276 printf("%%%c", format
[i
]);
279 } /* switch(%-command) */
284 printf("%c", format
[i
]);
286 } /* switch format character */
291 STRPTR
fixExpression(STRPTR val1
, STRPTR op
, STRPTR
*vals
)
293 /* val1 must be != 0 as it's an /A argument */
295 int i
; /* Loop variable */
298 len
= strlen(val1
) + 1 + 1; /* One extra for the 0 byte to end
303 len
+= strlen(op
) + 1;
306 if (vals
) for (i
= 0; vals
[i
] != NULL
; i
++)
308 len
+= strlen(vals
[i
]) + 1;
311 arg
= AllocVec(len
, MEMF_ANY
);
327 if (vals
) for (i
= 0; vals
[i
] != NULL
; i
++)
329 strcat(arg
, vals
[i
]);