/* * ASCII caesar cipher - rotate every letter in a phrase and print the result. * Numbers 65-90 are capital letters A-Z. 97-122 lowercase a-z. * If the first argument is an integer, it is used for the number of rotations. * Otherwise, the first argument is treated as text. * * Install as a command: * #!/bin/sh * gcc -s -o ~/.local/bin/caesar caesar.c * * Copyright (C) 2025 by lucke * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE * FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include #include #define USAGE "%s [+/-][ROTATIONS] Your Message\n" char caesar(int r, char c); /* * rot: Number of rotations * one: first argument to read as text * cur: current character to manipulate */ int main(int argc, char *argv[]) { int rot; int one; char cur; if (argc < 2) { putchar(7); /* bell */ fprintf(stderr, "Usage: " USAGE, argv[0]); return 1; } rot = atoi(argv[1]); one = 2; /* ROT13 by default */ if (rot == 0) { rot = 13; one = 1; } /* negatives wrap around, good for deciphering */ if (rot < 0) rot = 26 - (-1 * (rot % 26)); for (int i = one; i < argc; i++) { for (int j = 0; argv[i][j] != '\0'; j++) { cur = caesar(rot, argv[i][j]); putchar(cur); } /* seamlessly separate args */ if (i < argc - 1) putchar(' '); } putchar('\n'); return 0; } char caesar(int r, char c) { /* assume lowercase first */ if ((c > 122) || (c < 97)) goto notlower; c -= 97; c = (c + r) % 26; c += 97; return c; notlower: if ((c > 90) || (c < 65)) return c; c -= 65; c = (c + r) % 26; c += 65; return c; }