1
0

make rot13 into rot

This commit is contained in:
dtb 2023-12-04 19:58:53 -07:00
parent 19438441d2
commit 7410086b60
4 changed files with 65 additions and 82 deletions

View File

@ -1,28 +1,5 @@
all: rot13
rot-ascii.o: rot-ascii.c rot-ascii.h
clean:
rm -rf ../dist/rot13 ../dist/rot13.tar ../dist/rot13.tar.gz rot13
dist: ../dist/rot13.tar.gz
sane: rot13.c ../include/sysexits.h
$(CC) -DDONT_USE_SYSTEM_SYSEXITS -o rot13 rot13.c
rot13: rot13.c
$(CC) -o rot13 rot13.c
../dist/rot13: rot13
mkdir -p ../dist/rot13.tmp/bin/ ../dist/rot13.tmp/share/man/man1/
cp rot13 ../dist/rot13.tmp/bin/rot13
cp rot13.1 ../dist/rot13.tmp/share/man/man1/rot13.1
mv ../dist/rot13.tmp ../dist/rot13
../dist/rot13.tar: ../dist/rot13
cd ../dist/rot13 && pax -w -x ustar . >../rot13.tar.tmp
mv ../dist/rot13.tar.tmp ../dist/rot13.tar
../dist/rot13.tar.gz: ../dist/rot13.tar
gzip -c <../dist/rot13.tar >../dist/rot13.tar.gz.tmp
mv ../dist/rot13.tar.gz.tmp ../dist/rot13.tar.gz
.PHONY: all clean sane
rot-ascii: rot-ascii.o
$(CC) $(CFLAGS) -c -o rot.o -include "rot-ascii.h" rot.c
$(CC) $(CFLAGS) -o rot-ascii rot.o rot-ascii.o

30
rot13/rot-ascii.c Normal file
View File

@ -0,0 +1,30 @@
#include "rot-ascii.h"
#include <stdlib.h> /* size_t */
static CHAR
caesar_lower(CHAR c, size_t r){
static char alpha_lower[] = "abcdefghijklmnopqrstuvwxyz"
"abcdefghijklmnopqrstuvwxyz";
return : alpha_lower[c - alpha_lower[0]
+ r % 26 /* length of alphabet */];
}
static CHAR
caesar_upper(CHAR c, size_t r){
static char alpha_upper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
return alpha_upper[c - alpha_upper[0]
+ r % 26 /* length of alphabet */];
}
CHAR
caesar(CHAR c, size_t r){
return !ISALPHA(c)
? c
: ISLOWER(c)
? caesar_lower(c, r)
: caesar_upper(c, r);
}

10
rot13/rot-ascii.h Normal file
View File

@ -0,0 +1,10 @@
#define CHHR int
#include <ctype.h> /* isalpha(3), islower(3), isupper(3) */
#define ISALPHA(a) (((a) < 0x80) && isalpha(a))
#define ISLOWER(a) (((a) < 0x80) && islower(a))
#define ISUPPER(a) (((a) < 0x80) && isupper(a))
#include <stdio.h> /* getc(3), putc(3), stdin, stdout, EOF */
#define ENDOFFILE EOF
#define GETC getc
#define PUTC putc
/* #include <stdlib.h> /* size_t */

View File

@ -1,71 +1,37 @@
#include <stddef.h> /* stdin, stdout */
/* When rot13(1) is a part of ~trinity/src, which doesn't assume the system has
* <sysexits.h> and generates it out of a table. */
#ifdef DONT_USE_SYSTEM_SYSEXITS
# include "../include/sysexits.h" /* EX_OK, EX_USAGE */
#else
#include <errno.h> /* errno */
#include <stdlib.h> /* strtol(3), size_t */
#if !defined EX_OK || !defined EX_USAGE
# include <sysexits.h> /* EX_OK, EX_USAGE */
#endif
#ifdef U_UNICODE_VERSION /* libicu Unicode support */
# define CHARACTER UChar32
CHAR caesar(CHAR c, size_t r);
# include <uchar.h> /* u_isupper(3) */
# define ISUPPER u_isupper
# include <ustdio.h> /* U_EOF */
# define ENDOFFILE U_EOF
#else /* ifdef U_UNICODE_VERSION */
# define CHARACTER int
# include <ctype.h> /* isalpha(3), isupper(3) */
# define ISALPHA isalpha
# define ISUPPER isupper
# include <stdio.h> /* 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 <string.h> /* 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";
static char *program_name = "rot";
int main(int argc, char *argv[]){
CHAR c;
size_t r;
if(argc > 1){
fprintf(stderr, "Usage: %s\n",
if(argc > 2){
fprintf(stderr, "Usage: %s (rotation)\n",
argv[0] == NULL ? program_name : argv[0]
);
return EX_USAGE;
}
{ /* rot13 */
char *a; /* easier than doing freaky math */
CHARACTER c;
if(argc == 2){
r = strtol(argv[1], &argv[1], 10);
if(*argv[1] != '\0' || errno != 0){
fprintf(stderr, "%s: Invalid rotation\n", argv[0]);
return EX_USAGE;
}
}else
r = 13; /* default to rot13 */
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);
}
while((c = GETC(stdin)) != ENDOFFILE)
if(PUTC(caesar(c, r), stdout) == ENDOFFILE)
break;
return EX_OK;
}