diff --git a/src/sbbs3/ans2asc.c b/src/sbbs3/ans2asc.c index 2b790b3d7eec95291341b757c8294c5b10d9e165..b5f8a8533d73548dce5e07f38dd2321ff8aa933b 100644 --- a/src/sbbs3/ans2asc.c +++ b/src/sbbs3/ans2asc.c @@ -23,6 +23,7 @@ #include <stdlib.h> #include <string.h> /* strcmp */ #include "sauce.h" +#include "genwrap.h" #include "git_branch.h" #include "git_hash.h" @@ -45,6 +46,7 @@ static void print_usage(const char* prog) fprintf(stderr," -clear insert a clear screen code at beginning of output file\n"); fprintf(stderr," -pause append a pause (hit a key) code to end of output file\n"); fprintf(stderr," -space use space characters for cursor-right movement/alignment\n"); + fprintf(stderr," -esc use C-style string literal escaping of control and CP437 chars\n"); fprintf(stderr," -delay <int> insert a 1/10th second delay code at output byte interval\n"); fprintf(stderr," (lower interval values result in more delays, slower display)\n"); } @@ -57,6 +59,7 @@ int main(int argc, char **argv) FILE *out=stdout; bool ice=false; bool normal=false; + bool encode=false; int cols=0; int column=0; int delay=0; @@ -64,10 +67,11 @@ int main(int argc, char **argv) int pause=0; int space=0; int newline=0; + char* ctrl_a = "\1"; if(argc<2) { print_usage(argv[0]); - return(0); + return(0); } for(i=1; i<argc; i++) { @@ -94,6 +98,10 @@ int main(int argc, char **argv) normal = true; else if(strcmp(argv[i], "-newline") == 0) newline++; + else if(strcmp(argv[i], "-esc") == 0) { + encode = true; + ctrl_a = "\\x01"; + } else if(IS_DIGIT(argv[i][1])) cols = atoi(argv[i] + 1); else { @@ -103,7 +111,7 @@ int main(int argc, char **argv) } else if(in==stdin) { if((in=fopen(argv[i],"rb"))==NULL) { perror(argv[i]); - return(1); + return(1); } } else if(out==stdout) { if((out=fopen(argv[i],"wb"))==NULL) { @@ -124,7 +132,7 @@ int main(int argc, char **argv) const char* cond_newline = normal ? "\1+\1N\1/\1-" : "\1/"; if(clear) - fprintf(out,"\1N\1L"); + fprintf(out,"%sN%sL", ctrl_a, ctrl_a); esc=0; while((ch=fgetc(in))!=EOF && ch != CTRL_Z) { if(ch=='[' && esc) { /* ANSI escape sequence */ @@ -149,10 +157,10 @@ int main(int argc, char **argv) if(IS_DIGIT(ch)) { /* 3 digits */ n[ni]*=10; n[ni]+=ch&0xf; - ch=fgetc(in); - } + ch=fgetc(in); + } } - ni++; + ni++; } if(ch==';') continue; @@ -167,23 +175,23 @@ int main(int argc, char **argv) case 'f': case 'H': if(n[0]<=1 && n[1]<=1) /* home cursor */ - fputs("\1'", out); + fprintf(out, "%s'", ctrl_a); column = 0; break; case 'J': if(n[0]==2) /* clear screen */ - fputs("\1L",out); /* ctrl-aL */ + fprintf(out, "%sL", ctrl_a); else if(n[0]==0) /* clear to EOS */ - fputs("\1J",out); /* ctrl-aJ */ + fprintf(out, "%sJ", ctrl_a); column = 0; break; case 'K': - fputs("\1>",out); /* clear to eol */ + fprintf(out, "%s>", ctrl_a); /* clear to eol */ column = cols ? (cols - 1) : 79; break; case 'm': for(i=0;i<ni;i++) { - fputc(1,out); /* ctrl-ax */ + fprintf(out, ctrl_a); /* ctrl-ax */ switch(n[i]) { case 0: case 2: /* no attribute */ @@ -246,74 +254,90 @@ int main(int argc, char **argv) break; case 47: fputc('7',out); - break; + break; default: fprintf(stderr,"Unsupported ANSI color code: %u\n", (unsigned int)n[i]); break; - } + } } break; case 'B': /* cursor down */ while(n[0]) { - fprintf(out,"\1]"); /* linefeed */ + fprintf(out,"%s]", ctrl_a); /* linefeed */ n[0]--; } break; case 'C': /* cursor right */ if(space) fprintf(out, "%*s", n[0], " "); - else - fprintf(out,"\1%c",0x7f+n[0]); + else { + if(encode) + fprintf(out, "%s\\x%02X", ctrl_a, 0x7f + n[0]); + else + fprintf(out,"%s%c", ctrl_a, 0x7f+n[0]); + } column += n[0]; break; case 'D': /* cursor left */ column -= n[0]; if(n[0] >= column) - fprintf(out,"\1["); + fprintf(out,"%s[", ctrl_a); else while(n[0]) { - fprintf(out,"\1<"); + fprintf(out,"%s<", ctrl_a); n[0]--; } break; default: fprintf(stderr,"Unsupported ANSI code '%c' (0x%02X)\r\n",ch,ch); - break; + break; } - break; + break; } /* end of while */ esc=0; - continue; + continue; } /* end of ANSI expansion */ if(ch=='\x1b') esc=1; else { esc=0; - switch(ch) { - case '\r': - case '\n': - fputc(ch,out); - column = 0; - break; - default: - if(cols && column >= cols) { - fprintf(out, "%s", cond_newline); // Conditional-newline + if(encode) { + if(ch < ' ' || ch >= 0x7f) { + char* p = c_escape_char(ch); + if(p == NULL) + fprintf(out, "\\x%02X", ch); + else + fprintf(out, "%s", p); + } + else + fputc(ch, out); + } else { + switch(ch) { + case '\r': + case '\n': + fputc(ch,out); column = 0; - } - fputc(ch,out); - column++; - break; + break; + default: + if(cols && column >= cols) { + fprintf(out, "%s", cond_newline); // Conditional-newline + column = 0; + } + fputc(ch,out); + column++; + break; + } } if(delay && (ftell(out)%delay)==0) - fprintf(out,"\1,"); - } + fprintf(out,"%s,", ctrl_a); + } if(column < 0) column = 0; } while(newline--) fprintf(out,"\r\n"); if(pause) - fprintf(out,"\1p"); + fprintf(out,"%sp", ctrl_a); return(0); }