diff --git a/mkres.c b/mkres.c new file mode 100644 index 00000000..34521d96 --- /dev/null +++ b/mkres.c @@ -0,0 +1,343 @@ +/* + * + * Commands ... + * + * INIT(...) : Set configs. (rowstep, totwidth, stdheight, stdwidth) + * SPOS(V,H) : Set current position. + * + * SCOL : Standard column, for a single column, increment position + * NEXT(V,H) : increment postion by standard + (V,H) + * COL(K,N) : X,Y position for col K of N (default 1of [same as last]) + * SS : Standard size of last COL (using number of cols). + * ADJ(V,H) : Adjust next COL or SCOL by (V,H) + * + * CURX(H) : Current Xpos+H + * CURY(V) : Current Ypos+V + * + */ + +#include + +FILE * ifd; +FILE * ofd; + +char wordbuf[256]; + +#define T_INIT 100 /* Init the style of the values */ +#define T_SPOS 101 /* Set the current position */ +#define T_SCOL 102 /* Standard column COL(1,1), SS NEXT */ +#define T_NEXT 103 /* Next line */ +#define T_COL 104 /* Multi-column */ +#define T_SS 105 /* Standard Size */ +#define T_ADJ 106 /* Adjust next COL/SCOL */ +#define T_GRID 107 /* */ +#define T_GAP 108 /* */ + +#define T_CURX 120 /* Current X + offset */ +#define T_CURY 121 /* Current Y + offset */ + +#define T_SAVEPOSN 122 /* Save current status */ +#define T_RESTOREPOSN 123 /* Restore current status */ + + +struct keys { + char * name; + int token; +} keywords[] = { + {"INIT", T_INIT, }, + {"SPOS", T_SPOS, }, + {"SCOL", T_SCOL, }, + {"NEXT", T_NEXT, }, + {"COL", T_COL, }, + {"SS", T_SS, }, + {"ADJ", T_ADJ, }, + {"GRID", T_GRID, }, + {"GAP", T_GAP, }, + {"CURX", T_CURX, }, + {"CURY", T_CURY, }, + {"SAVEPOSN", T_SAVEPOSN, }, + {"RESTOREPOSN", T_RESTOREPOSN, }, + {0,0} +}; + +struct statbuf { + int token; + + int curx; + int cury; + int cols; + + int con_width; + int con_height; + int row_step; + int tot_width; + + int gutter; + + int vadjust; + int hadjust; +} + status, saved_status; + +int ar_count, ar_val[10]; + +main(argc, argv) +int argc; +char ** argv; +{ + int ch; + + ifd = stdin; ofd = stdout; + + while(!feof(ifd)) + { + if (ferror(ifd)) + { + fprintf(stderr, "Error reading input file\n"); + exit(1); + } + + if (readword() < 0) break; + + if (check_keys() < 0) + { + fprintf(ofd, "%s", wordbuf); + continue; + } + + /* To get here we have found one of our keywords, some words will + * be followed by an argument. + */ + + ar_count = 0; + + while((ch = getc(ifd)) != EOF && isspace(ch) && ch != '\n') + putc(ch, ofd); + + if (ch == '(' ) + { + for(;;) + { + ar_val[ar_count++] = get_number(); + + while((ch=getc(ifd)) != EOF && isspace(ch)) ; + if (ch != ',') break; + } + if (ch == EOF) break; + } + else + ungetc(ch, ifd); + + /* Ok got args, now doit */ + execute_command(); + } + exit(0); +} + +/* This is the lexer - not using lex(1) because this will have to + * compile under windows. + */ +int readword() +{ + int ch; + char *wp; + +try_again:; /* This is for "too big" words and strings. */ + + wp=wordbuf; + + /* Find a word ... */ + while((ch=getc(ifd)) != EOF && !isalpha(ch) && ch != '"') + putc(ch, ofd); + + if (ch == '"') + { + putc(ch, ofd); + + while((ch=getc(ifd)) != EOF && ch != '"') + putc(ch, ofd); + if (ch != EOF) + putc(ch, ofd); + + goto try_again; + } + + if (ch == EOF) return -1; + + do + { + if (wp>=wordbuf+sizeof(wordbuf)-2) + { + *wp = 0; + fprintf(ofd, "%s", wordbuf); + + while(ch!=EOF && isalpha(ch)) + { + putc(ch, ofd); + ch=getc(ifd); + } + ungetc(ch, ifd); + + goto try_again; + } + *wp++ = ch; + ch = getc(ifd); + } + while(ch != EOF && (isalnum(ch) || ch == '_')); + *wp = 0; + + ungetc(ch, ifd); + return wp-wordbuf; +} + +int +get_number() +{ + int ch; + int sign = 0; + int value = 0; + + while((ch=getc(ifd)) != EOF && isspace(ch)) ; + + if( ch == '+' ) { sign=1; ch=getc(ifd); } + else if( ch == '-' ) { sign=-1; ch=getc(ifd); } + + while(ch>='0' && ch<='9') + { + value = value * 10 + ch - '0'; + ch = getc(ifd); + } + + ungetc(ch, ifd); + if (sign < 0) value = -value; + + return value; +} + +check_keys() +{ + struct keys *p; + + for(p=keywords; p->name; p++) + { + if (strcmp(wordbuf, p->name) == 0 ) + { + status.token = p->token; + return p->token; + } + } + return -1; +} + +execute_command() +{ + if (status.cols < 1) status.cols = 1; + + switch(status.token) + { + case T_INIT: + if (ar_count > 0) status.row_step = ar_val[0]; + if (ar_count > 1) status.tot_width = ar_val[1]; + if (ar_count > 2) status.con_height = ar_val[2]; + else status.con_height = status.row_step; + if (ar_count > 3) status.con_width = ar_val[3]; + else status.con_width = status.tot_width; + + status.gutter = ( status.tot_width - status.con_width ) /2; + break; + + case T_SPOS: + status.cury = status.curx = 0; + if (ar_count > 0) status.cury = ar_val[0]; + if (ar_count > 1) status.curx = ar_val[1]; + break; + + case T_SCOL: + fprintf(ofd, "%d, %d", status.curx + status.hadjust, + status.cury + status.vadjust); + status.hadjust = status.vadjust = 0; + + fprintf(ofd, ", %d, %d", status.con_width, status.con_height); + + status.cury += status.row_step; + + if (ar_count > 0) status.cury += ar_val[0]; + if (ar_count > 1) status.curx += ar_val[1]; + break; + + case T_NEXT: + status.cury += status.row_step; + if (ar_count > 0) status.cury += ar_val[0]; + if (ar_count > 1) status.curx += ar_val[1]; + break; + + case T_COL: + { + int curcol; + int col_pos; + + if (ar_count > 0) curcol = ar_val[0]; else curcol = 1; + if (ar_count > 1) status.cols = ar_val[1]; + + col_pos = (status.con_width+status.gutter) *(curcol-1) /status.cols; + + fprintf(ofd, "%d, %d", + status.curx + status.hadjust + col_pos, + status.cury + status.vadjust); + status.hadjust = status.vadjust = 0; + } + break; + + case T_SS: + { + int wm = 1, hm=1; + int width; + if (ar_count > 0) wm = ar_val[0]; + if (ar_count > 1) hm = ar_val[1]; + + width = (status.con_width+status.gutter) / status.cols; + width *= wm; + width -= status.gutter; + + fprintf(ofd, "%d, %d", width, hm*status.con_height); + } + break; + + case T_ADJ: + if (ar_count > 0) status.vadjust = ar_val[0]; + if (ar_count > 1) status.hadjust = ar_val[0]; + break; + + case T_GRID: + if (ar_count > 0) status.cols = ar_val[0]; + else status.cols = 1; + if (ar_count > 1) status.con_height = ar_val[1]; + if (ar_count > 2) status.row_step = ar_val[2]; + break; + + case T_GAP: + if (ar_count > 0) status.cury += ar_val[0]; + else status.cury += 2; + break; + + case T_CURX: + if (ar_count>0) + fprintf(ofd, "%d", status.curx+ar_val[0]); + else + fprintf(ofd, "%d", status.curx); + break; + case T_CURY: + if (ar_count>0) + fprintf(ofd, "%d", status.cury+ar_val[0]); + else + fprintf(ofd, "%d", status.cury); + break; + + case T_SAVEPOSN: + saved_status = status; + break; + case T_RESTOREPOSN: + status = saved_status; + break; + } +}