/* Program: CODE.C Author : Kim Moser Date : 02/16/89 System : IBM PC / Borland Turbo-C 2.0 Descrip: Encodes stdin and sends it to stdout Usage : CODE [+|-][+|-] + or - before key means add or subtract key to/from data + or - after key means add or subtract data to/from key */ #include #include /* exit() */ #include /* setmode() */ #include /* O_BINARY */ #include void usage(void) { fputs( "CODE v1.0 09/30/89 Copyright (C) 1989 Kim Moser All Rights Reserved\n", stderr ); fputs( "CODE: Encodes data from stdin, writes encoded form to stdout\n", stderr ); fputs( "Usage: CODE [+|-]key[+|-]\n", stderr ); fputs( " '+' or '-' before key means add key to or subtract key from data\n", stderr ); fputs( " '+' or '-' after key means add data to or subtract data from key\n", stderr ); exit(-11); } void main(argc, argv) int argc; char **argv; { int pre=0, post=0; /* -1=subtract, 0=no op, 1=add */ unsigned int key; int ch; int i; if (argc!=2) usage(); switch(argv[1][0]) { case '+': pre=1; break; case '-': pre=-1; break; } if (!argv[1][pre?1:0]) usage(); /* Nothing left to parse */ if (!isdigit(argv[1][pre?1:0])) usage(); /* No key follows */ if (!sscanf(&argv[1][pre?1:0],"%u",&key)) usage(); /* Starting at 2nd char, find first non-digit (or EOS): */ for (i=1; isdigit(argv[1][i]) && argv[1][i]; i++); /* Find first non-digit (or EOS): */ while ( isdigit(argv[1][i]) && argv[1][i] ) i++; switch(argv[1][i]) { case '+': post=1; break; case '-': post=-1; break; case '\0': /* Do nothing */ break; otherwise: usage(); } if (!pre && !post) usage(); /* Only key specified */ fprintf( stderr, "Formula: %s%s%u%s%s\n", (pre?"Data":""), (pre<0?" - ":(pre>0?" + ":"")), key, (post<0?" -":(post>0?" +":"")), (post?" data":"") ); if ( setmode(fileno(stdin),O_BINARY) ) { fputs("Unable to set stdin to binary.\n", stderr); exit(-1); } if ( setmode(fileno(stdout),O_BINARY) ) { fputs("Unable to set stdout to binary.\n", stderr); exit(-1); } while ((ch=getchar())!=EOF) { if (pre<0) ch-=key; else if (pre>0) ch+=key; if (post<0) ch = key-ch; else if (post>0) ch = key+ch; putchar(ch); } }