#include /* stdin, stdout */ /* When rot13(1) is a part of ~trinity/src, which doesn't assume the system has * and generates it out of a table. */ #ifdef DONT_USE_SYSTEM_SYSEXITS # include "../include/sysexits.h" /* EX_OK, EX_USAGE */ #else # include /* EX_OK, EX_USAGE */ #endif #ifdef U_UNICODE_VERSION /* libicu Unicode support */ # define CHARACTER UChar32 # include /* u_isupper(3) */ # define ISUPPER u_isupper # include /* U_EOF */ # define ENDOFFILE U_EOF #else /* ifdef U_UNICODE_VERSION */ # define CHARACTER int # include /* isalpha(3), isupper(3) */ # define ISALPHA isalpha # define ISUPPER isupper # include /* getc(3), putc(3) */ # define ENDOFFILE EOF # define GETC getc # define PUTC putc #endif /* ifdef U_UNICODE_VERSION */ static char *program_name = "rot13"; // /* Assumes this is a character in the provided glyph system. // * Probably not Unicode-capable but doesn't assume Alphabet. // * Returns `c` rotated around `a` by `r` characters. */ // #include /* strchr(3), strlen(3) */ // static int // caesar(char c, int r, const char *a){ // return a[(strchr(a, c) - a + r) % strlen(a)]; // } /* Or... make some static arrays of the alphabet * 1.5, so c + '\0' + 13 is * always a valid index and always reflects the correct rotation (13 places). */ static char alpha_upper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLM"; static char alpha_lower[] = "abcdefghijklmnopqrstuvwxyzabcdefghijklm"; int main(int argc, char *argv[]){ if(argc > 1){ fprintf(stderr, "Usage: %s\n", argv[0] == NULL ? program_name : argv[0] ); return EX_USAGE; } { /* rot13 */ char *a; /* easier than doing freaky math */ CHARACTER c; while((c = GETC(stdin)) != ENDOFFILE) if(isalpha(c)){ a = isupper(c) ? alpha_upper : alpha_lower; PUTC(a[c - a[0] + 13], stdout); }else PUTC(c, stdout); } return EX_OK; }