/* * Program to do *very* simple encryption (rotate alphabet N positions). * * N, and input and output filenames, are given by command-line arguments. */ #include #include #include char* lc_alphabet = "abcdefghijklmnopqrstuvwxyz"; char* uc_alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int rotate(int inchar, int positions_to_rotate); /* main program */ int main(int argc, char* argv[]) { if (argc < 4) { fprintf(stderr, "usage %s pos_to_rotate infile outfile\n", argv[0]); return EXIT_FAILURE; } char* endptr; int n = strtol(argv[1], &endptr, 10); if ((*endptr != '\0') || n <= 0) { fprintf(stderr, "%s not a positive integer\n", argv[1]); return EXIT_FAILURE; } FILE* infile = fopen(argv[2], "r"); if (infile == NULL) { fprintf(stderr, "cannot open input file %s\n", argv[2]); return EXIT_FAILURE; } FILE* outfile = fopen(argv[3], "w"); if (outfile == NULL) { fprintf(stderr, "cannot open output file %s\n", argv[3]); return EXIT_FAILURE; } int inchar; while ((inchar = fgetc(infile)) != EOF) { fputc(rotate(inchar, n), outfile); } return EXIT_SUCCESS; } /* encode single character */ int rotate(int inchar, int positions_to_rotate) { char* in_lc_alphabet = strchr(lc_alphabet, inchar); char* in_uc_alphabet = strchr(uc_alphabet, inchar); if (in_lc_alphabet != NULL) { int pos = in_lc_alphabet - lc_alphabet; return lc_alphabet[(pos + positions_to_rotate) % strlen(lc_alphabet)]; } else if (in_uc_alphabet != NULL) { int pos = in_uc_alphabet - uc_alphabet; return uc_alphabet[(pos + positions_to_rotate) % strlen(uc_alphabet)]; } else { return inchar; } }