#include #include #include #include "joey.h" #define MAX_LINE_SIZE 8192 #define STATE_COMMAND 1 #define STATE_NUMBER 2 #define STATE_EXECUTE 3 #define COMMAND_COLOR 1 // C #define COMMAND_CLEAR 2 // E #define COMMAND_PLOT 3 // D (Draw) #define COMMAND_LINE 4 // L #define COMMAND_FILL 5 // F #define COMMAND_PALETTE 6 // P #define COMMAND_RESET 7 // R #define COMMAND_HBOX 8 // B (Box) #define COMMAND_FBOX 9 // S (Solid Box) #define COMMAND_FILLTO 10 // T (FillTo) typedef struct { char *keyword; byte command; byte args; } CommandT; static CommandT commands[] = { { "COLOR", COMMAND_COLOR, 1 }, { "CLEAR", COMMAND_CLEAR, 0 }, { "PLOT", COMMAND_PLOT, 2 }, { "LINE", COMMAND_LINE, 2 }, { "FILL", COMMAND_FILL, 2 }, { "PALETTE", COMMAND_PALETTE, 4 }, { "PAL", COMMAND_PALETTE, 4 }, { "RESET", COMMAND_RESET, 0 }, { "BOX", COMMAND_HBOX, 4 }, { "FILLEDBOX", COMMAND_FBOX, 4 }, { "FBOX", COMMAND_FBOX, 4 }, { "FILLTO", COMMAND_FILLTO, 3 } }; // Ugly Macros #define EMIT_COMMAND fputc((byte)data[0], out) #define EMIT_COUNT fputc((byte)count, out) #define EMIT_BYTE fputc((byte)data[i], out) #define EMIT_JINT16 _emitJint16(data[i], out); void _emitJint16(jint16 data, FILE *out) { #ifdef JOEY_LITLE_ENDIAN fputc((byte)(data & 0xFF), out); fputc((byte)(data >> 8), out); #else fputc((byte)(data >> 8), out); fputc((byte)(data & 0xFF), out); #endif } int _stricmp(const char *a, const char *b) { int ca; int cb; do { ca = (unsigned char)*a++; cb = (unsigned char)*b++; if (islower(ca)) ca = toupper(ca); if (islower(cb)) cb = toupper(cb); } while (ca == cb && ca != '\0'); return ca - cb; } int main(int argc, char *argv[]) { FILE *in; FILE *out = NULL; char line[MAX_LINE_SIZE]; char *token; int tokenLength; jint16 data[1024]; int dIndex; int state; int args; int count; int i; int x; jint16 x1; jint16 y1; jint16 x2; jint16 y2; if (argc < 3) { printf("Usage: %s [infile] [outfile]\n", argv[0]); return 1; } jlUtilStartup("JoeyLib VecDraw"); jlDisplayBorder(BORDER_BLACK); while (!jlUtilMustExit()) { in = fopen(argv[1], "rt"); if (in == NULL) { jlUtilShutdown(); } out = fopen(argv[2], "wb"); if (out == NULL) { fclose(in); jlUtilShutdown(); } fputs("VEC", out); // File "Magic" fputc(0, out); // Version while (fgets(line, MAX_LINE_SIZE, in) != NULL) { state = STATE_COMMAND; dIndex = 0; token = strtok(line, " "); while (token != NULL) { tokenLength = (int)strlen(token); if (tokenLength > 0) { // Handle Comments if (token[0] == '#') { break; } // Handle EOLs if ((token[tokenLength - 1] == 10) || (token[tokenLength - 1] == 13)) { tokenLength--; token[tokenLength] = 0; } if (tokenLength > 0) { //printf("[%s] %d\n", token, dIndex); // What is this? if (state == STATE_COMMAND) { for (i=0; i<(int)(sizeof(commands)/sizeof(CommandT)); i++) { //printf("Checking [%s] == [%s]\n", token, commands[i].keyword); if (_stricmp(token, commands[i].keyword) == 0) { data[dIndex++] = commands[i].command; state = (commands[i].args == 0 ? STATE_EXECUTE : STATE_NUMBER); //printf("Found [%s] expecting %d args\n", token, commands[i].args); break; } } if (state == STATE_COMMAND) { printf("Unknown command [%s]\n", token); break; } } else { if (state == STATE_NUMBER) { data[dIndex++] = (jint16)atoi(token); } } } } token = strtok(NULL, " "); } // Can we execute this? if (dIndex > 0) { args = dIndex - 1; i = 1; //printf("Command %d with %d args\n", data[0], args); switch (data[0]) { case COMMAND_COLOR: if (args == 1) { EMIT_COMMAND; EMIT_BYTE; jlDrawColor((byte)data[i]); } break; case COMMAND_CLEAR: if (args == 0) { EMIT_COMMAND; jlDrawClear(); } break; case COMMAND_PLOT: count = args % 2; if (count == 0) { count = args / 2; EMIT_COMMAND; EMIT_COUNT; for (x=0; x= 4)) { count = args / 2; EMIT_COMMAND; EMIT_COUNT; EMIT_JINT16; x1 = data[i++]; EMIT_BYTE; y1 = data[i++]; for (x=1; x