SHOW:
|
|
- or go back to the newest paste.
| 1 | /* | |
| 2 | * Simple Caesar cypher algorithm | |
| 3 | * Preserves case and non-alpha characters | |
| 4 | * by The Lightning Stalker | |
| 5 | */ | |
| 6 | ||
| 7 | #include <stdio.h> | |
| 8 | #include <ctype.h> | |
| 9 | ||
| 10 | #define ALPHA 26 // letters in alphabet | |
| 11 | - | #define CONVBASE 7 // conversion base |
| 11 | + | #define CONVBASE -7 // conversion base |
| 12 | - | #define COMPLEMENT ALPHA - CONVBASE // conversion complement |
| 12 | + | #if CONVBASE < 0 |
| 13 | - | #define CHARLMIN *"a" + CONVBASE // smallest char without rollover |
| 13 | + | #define CONVBASE_IS_NEG |
| 14 | - | #define CHARUMIN *"A" + CONVBASE // . . . |
| 14 | + | #endif |
| 15 | #ifdef CONVBASE_IS_NEG | |
| 16 | #define COMPLEMENT ALPHA + CONVBASE // conversion complement | |
| 17 | #define CHARLMIN *"a" - CONVBASE // smallest char without rollover | |
| 18 | #define CHARUMIN *"A" - CONVBASE // . . . | |
| 19 | #else | |
| 20 | #define COMPLEMENT CONVBASE - ALPHA // conversion complement | |
| 21 | #define CHARLMIN *"z" - CONVBASE // largest character without | |
| 22 | #define CHARUMIN *"Z" - CONVBASE // rollover | |
| 23 | - | for (c = 0; c < sizeof(stringin); c++) |
| 23 | + | #endif |
| 24 | - | {
|
| 24 | + | |
| 25 | - | if (isalpha(stringin[c])) |
| 25 | + | |
| 26 | //~ static const char stringin[] = "Chrome Country"; // . . . | |
| 27 | ||
| 28 | - | stringout[c] = stringin[c] - CONVBASE; |
| 28 | + | |
| 29 | {
| |
| 30 | int c; | |
| 31 | char stringout[256]; | |
| 32 | ||
| 33 | - | stringout[c] = stringin[c] - CONVBASE; |
| 33 | + | for (c = 0; c < sizeof(stringin); c++) // Take a look at each |
| 34 | { // character, one at a time
| |
| 35 | if (isalpha(stringin[c])) // and apply the cypher. | |
| 36 | if (islower(stringin[c])) | |
| 37 | #ifdef CONVBASE_IS_NEG | |
| 38 | if (stringin[c] >= CHARLMIN) | |
| 39 | #else | |
| 40 | if (stringin[c] <= CHARLMIN) | |
| 41 | #endif | |
| 42 | stringout[c] = stringin[c] + CONVBASE; | |
| 43 | else | |
| 44 | stringout[c] = stringin[c] + COMPLEMENT; | |
| 45 | else | |
| 46 | #ifdef CONVBASE_IS_NEG | |
| 47 | if (stringin[c] >= CHARUMIN) | |
| 48 | #else | |
| 49 | if (stringin[c] <= CHARUMIN) | |
| 50 | #endif | |
| 51 | stringout[c] = stringin[c] + CONVBASE; | |
| 52 | else | |
| 53 | stringout[c] = stringin[c] + COMPLEMENT; | |
| 54 | else | |
| 55 | stringout[c] = stringin[c]; | |
| 56 | } | |
| 57 | printf("%s\n", stringout);
| |
| 58 | return(0); | |
| 59 | } |