home *** CD-ROM | disk | FTP | other *** search
- /*-------------------------------------------------------------------------*/
- /* Program: echo */
- /* Programmer: George Kerber */
- /* Written: 08/26/89 */
- /* Compiler: Lattice 5.04 */
- /*-------------------------------------------------------------------------*/
-
- #include <stdio.h>
- #include <dos.h>
- #include <stdlib.h>
- #include <string.h>
- #include <exec/types.h>
-
- #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
-
- \*-------------------------------------------------------------------------*/
-