/** * trans - A program to replace characters in stdin * a replication of tr(1) * by Nathaniel "Nat" Welch * CSC 357 * Due 4/9/08 * * DF 82 8A F5 6F EF 0F 15 F6 12 09 0B 03 21 DA CF */ #include #include #include /*Function Stubs */ int parseArgs(char* arg); int parseLine(char* ret); void print(char* arg); void replace(char* in, char* set1, char* set2); int delete(char* set1, char* in); int main(int argc, char * argv[]) { char* work = NULL; work = (char*)malloc(sizeof(char)*100); if(argc == 1 || argc > 3) { printf("Trans, a simple implementation of tr\n"); printf("use: %s [-d] SET1 [SET2]\n",argv[0]); return 1; } else { while(!parseLine(work)) { /* print(work); */ if(strcmp("-d", argv[1]) == 0) { delete(argv[2],work); print(work); } else if(argc == 3) { replace(work,argv[1],argv[2]); print(work); } else { printf("I'm Sorry, your variables are incorrect.\n"); return 2; } } free(work); return 0; } } /** * Replaces characters from set1 with those of set2 in in. */ void replace(char* in, char* set1, char* set2) { int c = 0; int r = 0; while(*(in + c) != '\0') { r = 0; while(*(set1 + r) != '\0') { if(*(in + c) == *(set1 + r)) { *(in + c) = *(set2 + r); } r++; } c++; } } /** * prints out the provided char array. */ void print(char* arg) { int c = 0; while(*(arg + c) != '\0') { printf("%c",*(arg + c)); c++; } printf("\n"); } /** * deletes the chars in set1 from in */ int delete(char* set1, char* in) { int c = 0; int r = 0; while(*(in + c) != '\0') { while(*(set1 + r) != '\0') { if(*(in + c) == *(set1 + r)) { /*delete crap...*/ } r++; } c++; } return 0; } /* parses input. return 1 if last char is EOF */ int parseLine(char* ret) { char temp; int c = 0; int edge = 100; int die = 0; /* ret = (char*)malloc(sizeof(char)*edge); */ temp = (char)getchar(); while(temp != '\n') { *(ret + c) = temp; c++; temp = (char)getchar(); if( c == edge-1) { edge += 100; ret = (char*)realloc(ret, sizeof(char)*edge); } if(temp == EOF) { die = 1; } } *(ret + c) = '\0'; return die; } /* Replaces special chars in arguments */ int parseArgs(char* arg) { int c = 0; int d = 0; int ret = 0; while(*(arg + c) != '\0') { if(*(arg + c) == '\\') { if(*(arg + c + 1) == 'n') { *(arg + c) = '\n'; ret++; } else if(*(arg + c + 1) == 't') { *(arg + c) = '\t'; ret++; } else if(*(arg + c + 1) == '\\') { *(arg + c) = '\\'; ret++; } d = c; while(*(arg + d) != '\0') { *(arg + d) = *(arg + d + 1); d++; } } else { c++; } } return ret; }