/*-------------------------------------------------------------------------*/ /* Program: echo */ /* Programmer: George Kerber */ /* Written: 08/26/89 */ /* Compiler: Lattice 5.04 */ /*-------------------------------------------------------------------------*/ #include #include #include #include #include #define WRITTEN "08/26/89 - 01/01/90" #define VERSION "v1.08c" void addchar(); /* Adds characters to outputstring */ void addstr(); /* Adds string to outputstring */ void helpscreen(); /* Helpscreen */ void main(); /* Main */ void makeline(); /* Makes a black line */ void mistake(); /* Handles errors */ void putcode(); /* By Garry Glendown (modified by GK) */ void setattr(); /* Switch to set attributes */ int verifyopt(); /* Verifies options for numeric content */ char node[32] , outputstring[256] = ""; char opts[] = "mudhrpsa" , option , *option1; void main(int argc, char *argv[]) { int escape_char = '*' ; char *tempy; char spacer[80]; char *token; /* used for strtok */ int i , c_count , counter = -1 , next , z[2] ; int kflag = 0, nflag = 0, xflag = 0, xyflag = 0, cflag = 0; /*----- Sets escape value -------------------------------------------------*/ tempy = getenv("ESCAPE"); if(tempy != NULL) escape_char = *tempy; /*----- Calls helpscreen if argv[1] = ? -----------------------------------*/ stcgfn(node,argv[0]); if(argc == 2 && argv[1][0] == '?') helpscreen(escape_char); /*----- Gets options ------------------------------------------------------*/ c_count = 0; for( next = 1 ; (option1 = argopt(argc,argv,opts,&next,&option)) != NULL ; ) { switch(toupper(option)) { case 'A': token = strtok(option1,","); i = 0; while(token != NULL) { if(strlen(token) > 1) mistake("Invalid -a option"); setattr(token[0]); token = strtok(NULL,","); } break; case 'X': xflag++; break; /* center line */ case 'N': nflag++; break; /* supress newline */ case 'K': kflag++; break; /* don't reset attributes */ case 'Z': cflag++; nflag = 1; break; /* remove cursor */ case 'E': putcode(1); break; /* clear to bottom of screen */ case 'C': putcode(0); break; /* clear screen */ case 'H': putcode(2,(verifyopt(option1))); break; /* scroll up */ case 'R': putcode(3,(verifyopt(option1))); break; /* scroll down */ case 'U': putcode(4,(verifyopt(option1))); break; /* move up */ case 'D': putcode(5,(verifyopt(option1))); break; /* move down */ case 'P': token = strtok(option1,","); i = 0; while(token != NULL) { z[i] = verifyopt(token); if(++i > 2) mistake("Excess Options for -p"); token = strtok(NULL,","); } if(i != 2) mistake("Missing Option for -p"); if(z[1] > 23) mistake("Lines > 23"); if(z[0] > 77) mistake("Character Position > 77"); if(z[0] != 0) xyflag = 1; putcode(6,z[0],z[1]); break; case 'M': xyflag = 1; i = verifyopt(option1); if(!i || i > 69) mistake("Entry must be 1 - 69"); for( ; i > 0 ;strcat(spacer," "), i--) ; break; default: mistake("Invalid Option"); break; } } /* ----- More error checking -------------------------------------------*/ if(argc > (next + 1)) { if(stricmp(argv[next + 1],"NOLINE")) mistake("Final option can only be NOLINE"); if(argc > (next + 2)) mistake("Invalid Option Count"); } /*----- Checks input string for escape characters -------------------------*/ if(argc != next) { while(argv[next][++counter] != (char *)NULL) { if(argv[next][counter] == escape_char) { if(argv[next][++counter] == escape_char) { c_count++; addchar(escape_char); continue; } switch(argv[next][counter]) { case 'n' : addchar('\n'); xyflag = 1; break ; /* newline */ case 't' : addchar('\t'); break ; /* tab */ case 'b' : addchar('\b'); break ; /* backspace */ case 'q' : addchar('"') ; c_count++ ; break ; /* quote " */ case '$' : break; case '\\': addchar('\\'); c_count++ ; break ; /* backslash */ default : /* check for attribute escape options */ setattr(argv[next][counter]); break ; } } else { if(xflag) c_count++; addchar(argv[next][counter]); } continue; } } /*----- Actually prints outputstring if one was entered -------------------*/ if(xflag && xyflag) mistake("Invalid option combined with -x"); if(xflag) { if(c_count > 74) mistake("Input string too long to center"); c_count = (80 - c_count) / 2; for( ; c_count > 0 ;strcat(spacer," "), c_count--) ; } if(cflag) { sprintf(node," \b"); strcat(outputstring,node); } printf("%s%s",spacer,outputstring); if(!kflag) printf(""); /* retains attribute options if -k */ if(!stricmp(argv[argc - 1],"NOLINE")) nflag = 1; if(!nflag) printf("\n"); exit(0); } /*-------------------------------------------------------------------------*/ /* addstr FUNCTION (copies passed string to outputstring) */ void addstr(char string1[]) { strcat(outputstring,string1); } /*-------------------------------------------------------------------------*/ /* ADDCHAR FUNCTION (copies passed character to outputstring */ void addchar(int char1) { int i; i = strlen(outputstring); outputstring[i] = char1; outputstring[i + 1] = '\0'; } /*-------------------------------------------------------------------------*/ /* HELPSCREEN FUNCTION */ void helpscreen(int escape_char) { int i; i = 0; putcode(0); makeline(); printf("\n%6c%s%13cGeorge Kerber%11s%26s\n\n",i,node,i,VERSION,WRITTEN); printf("%6cSYNTAX: %s [-options] [\"string\"] [NOLINE]\n\n",i,node); printf("%22cEscape Character is currently set to \"%c\"\n\n",i,escape_char); printf("%11c-a n,n... Text/screen attributes. (see docs)\n",i); printf("%11c-c%10cClear the screen.\n",i,i); printf("%11c-e%10cDelete from cursor to bottom of screen.\n",i,i); printf("%11c-n%10cSame as NOLINE, supress newline after printing string.\n",i,i); printf("%11c-k%10cRetain attributes.\n",i,i); printf("%11c-x%10cCenter string \(Incompatible with -m\)\n",i,i); printf("%11c-h|r n%6cScroll up(h) or down(r) \"n\" lines.\n",i,i); printf("%11c-u|d n%6cMove cursor up or down \"n\" lines.\n",i,i); printf("%11c-m n%8cBegin string at char position \"n\" (0-77).\n",i,i); printf("%11c-p x,y%6cSet cursor to position x,y.\n",i,i); printf("%22cwhere x = char position (0-77) & y = line (0-23).",i); makeline(); printf("\n"); exit(0); } /*-------------------------------------------------------------------------*/ /* MAKELINE FUNCTION (prints a black line when called) */ void makeline() { printf("\n ___________________________________________________________________________\n"); } /*-------------------------------------------------------------------------*/ /* MISTAKE FUNCTION (prints a passwd error message, then exits 5) */ void mistake(char description[]) { makeline(); fprintf(stderr,"\n\07 ERROR: %s %s.",node,description); makeline(); printf("\n"); exit(5); } /*-------------------------------------------------------------------------*/ /* PUTCODE FUNCTION */ /* putcode directions 0 putcode(0) clear screen 1 putcode(1) clear to end of screen 2 putcode(2,x) scroll up 'x' lines 3 putcode(3,x) scroll down 'x' lines 4 putcode(4,x) move cursor up 'x' lines 5 putcode(5,x) move cursor down 'x' lines 6 putcode(6,x,y) position cursor, x = char # and y = line # */ UBYTE code[][9]={ {12,0}, /* 0 Clear screen */ {0x9b,0x4a,0}, /* 1 Clear to end of screen */ {0x9b,1,0x53,0}, /* 2 Scroll up */ {0x9b,1,0x54,0}, /* 3 Scroll down */ {0x9b,1,0x41,0}, /* 4 Move cursor up */ {0x9b,1,0x42,0}, /* 5 Move cursor down */ {0x9b,1,';',1,0x48,0}, /* 6 Position cursor x,y */ }; void putcode(int n, int a0, int a1) { int a[3],g,zz = 0; if(n == 6) { /* reverse a0 and a1 for normal x & y */ g = a0; a0 = a1; a1 = g; } a[0] = a0 ; a[1] = a1 ; a[2] = -1 ; if(n != 6) a[1] = -1; if(n == 0 || n == 1) a[0] = -1; for(g = 0 ; g < 7 ; g++ ) { if(!code[n][g]) { g = 10; } else { if(code[n][g] == 1) { if (a[zz] != -1) printf("%d",a[zz]); zz++; } else { putchar(code[n][g]); } } } } /*-------------------------------------------------------------------------*/ /* SETATTR FUNCTION (switch statement to handle escape options) */ void setattr(int char2) { switch(char2) { case '0': addstr(""); break; /* color 0 char */ case '1': addstr(""); break; /* color 1 char */ case '2': addstr(""); break; /* color 2 char */ case '3': addstr(""); break; /* color 3 char */ case 'D': case '4': addstr(""); break; /* default attr */ case 'B': case '5': addstr(""); break; /* bold char  */ case 'U': case '6': addstr(""); break; /* underline char  */ case 'I': case '7': addstr(""); break; /* italics char  */ case ')': addstr(""); break; /* color 0 bkgnd */ case '!': addstr(""); break; /* color 1 bkgnd */ case '@': addstr(""); break; /* color 2 bkgnd */ case '#': addstr(""); break; /* color 3 bkgnd  */ default : mistake("Invalid ATTRIBUTE argument"); break; } } /*-------------------------------------------------------------------------*/ /* VERIFYOPT FUNCTION (verifies numeric value and sets j[passed]) */ int verifyopt(char xxx[], int j_value) { int i; if(!strcmp(xxx,"")) mistake("Requires numeric argument for option"); for(i = strlen(xxx) ; i >= 1 ; i-- ) { if(!isdigit(xxx[i - 1])) mistake("Missing, negative or non-numeric entry"); } return(atoi(xxx)); } /*-------------------------------------------------------------------------*\ 11/01/89 v1.08b: Re-compiled with Lattice 5.04 \*-------------------------------------------------------------------------*/