COMMON/xa-pre-process/main.c

64 lines
1.4 KiB
C
Raw Normal View History

2018-08-07 02:14:36 +00:00
#include <stdio.h>
#include <limits.h>
#include <string.h>
#include "xapp.h"
#include "xapp.yy.h"
2018-08-07 02:14:36 +00:00
long long result;
int main(int argc, char **argv)
{
TOKEN tokens[TOKENS];
char buffer[IO_BUFFER] = {'\0'};
/* Process input */
while (fgets(buffer, IO_BUFFER, stdin))
{
/* Tokenize the line */
int count;
if (count = tokenizeInput(buffer, tokens))
{
/* Iterate through the tokens */
int i;
for (i = 0; i < count; ++i)
{
2018-08-13 12:49:48 +00:00
int j, sign;
2018-08-07 02:14:36 +00:00
const char *s = "", *p, *q;
switch (tokens[i].type)
{
/* Process each _SET_V("<expr>") command */
case TT_COMMAND:
/* Extract the start and ending indices */
p = strchr(tokens[i].text, '"') + 1;
q = strrchr(tokens[i].text, '"');
/* Parse the input */
yyin = fmemopen((void *)p, q - p, "r");
yyparse();
fclose(yyin);
2018-08-13 12:49:48 +00:00
/* Round towards ± infinity */
sign = result < 0? -1: +1;
if (sign < 0) result = -result;
result += 1 << (INT_FRAC - EXP_FRAC - 1);
/* Normalize */
result >>= (INT_FRAC - EXP_FRAC);
if (sign < 0) result = -result;
2018-08-13 12:49:48 +00:00
/* Output in .BYTE format */
2018-08-07 02:14:36 +00:00
for (j = 0; j < EXP_FULL; j += CHAR_BIT)
{
printf("%s$%02llX", s, result & 0xff);
result >>= CHAR_BIT;
2018-08-07 02:14:36 +00:00
s = ", ";
}
break;
default:
/* Default, just print it */
printf("%s", tokens[i].text);
break;
}
}
}
}
return 0;
}