diff options
author | Ian C <ianc@noddybox.co.uk> | 2016-03-07 15:00:21 +0000 |
---|---|---|
committer | Ian C <ianc@noddybox.co.uk> | 2016-03-07 15:00:21 +0000 |
commit | 77e8708934c5c792b1435fa11dfe3c0a6f636a8c (patch) | |
tree | 8c68ecddaf2c2c0730ba310b8d1b9e0f1bd16132 /src/codepage.c | |
parent | 6e9c9c9205d6eec1ff1cfb3fa407c6714854145a (diff) |
Updated README and copied latest version in.
Diffstat (limited to 'src/codepage.c')
-rw-r--r-- | src/codepage.c | 259 |
1 files changed, 259 insertions, 0 deletions
diff --git a/src/codepage.c b/src/codepage.c new file mode 100644 index 0000000..0083947 --- /dev/null +++ b/src/codepage.c @@ -0,0 +1,259 @@ +/* + + casm - Simple, portable assembler + + Copyright (C) 2003-2015 Ian Cowburn (ianc@noddybox.demon.co.uk) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + + ------------------------------------------------------------------------- + + Code page handling. + +*/ +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include <ctype.h> + +#include "global.h" +#include "codepage.h" + +/* ---------------------------------------- TYPES +*/ + +typedef enum +{ + CP_ASCII, + CP_ZX81, + CP_SPECTRUM, + CP_CBM +} Codepage; + + +typedef struct +{ + int code; + int result; +} CodepageDef; + + +enum option_t +{ + OPT_CODEPAGE +}; + + +static const ValueTable option_set[] = +{ + {"codepage", OPT_CODEPAGE}, + {"charset", OPT_CODEPAGE}, + {NULL} +}; + + +static const ValueTable codepage_table[] = +{ + {"ascii", CP_ASCII}, + {"zx81", CP_ZX81}, + {"spectrum", CP_SPECTRUM}, + {"cbm", CP_CBM}, + {NULL} +}; + + + +/* ---------------------------------------- GLOBALS +*/ +static Codepage cp = CP_ASCII; + +static CodepageDef cp_ascii[] = +{ + {' ', 0x20}, {'!', 0x21}, {'"', 0x22}, {'#', 0x23}, + {'$', 0x24}, {'%', 0x25}, {'&', 0x26}, {'\'', 0x27}, + {'(', 0x28}, {')', 0x29}, {'*', 0x2a}, {'+', 0x2b}, + {',', 0x2c}, {'-', 0x2d}, {'.', 0x2e}, {'/', 0x2f}, + {'0', 0x30}, {'1', 0x31}, {'2', 0x32}, {'3', 0x33}, + {'4', 0x34}, {'5', 0x35}, {'6', 0x36}, {'7', 0x37}, + {'8', 0x38}, {'9', 0x39}, {':', 0x3a}, {';', 0x3b}, + {'<', 0x3c}, {'=', 0x3d}, {'>', 0x3e}, {'?', 0x3f}, + {'@', 0x40}, {'A', 0x41}, {'B', 0x42}, {'C', 0x43}, + {'D', 0x44}, {'E', 0x45}, {'F', 0x46}, {'G', 0x47}, + {'H', 0x48}, {'I', 0x49}, {'J', 0x4a}, {'K', 0x4b}, + {'L', 0x4c}, {'M', 0x4d}, {'N', 0x4e}, {'O', 0x4f}, + {'P', 0x50}, {'Q', 0x51}, {'R', 0x52}, {'S', 0x53}, + {'T', 0x54}, {'U', 0x55}, {'V', 0x56}, {'W', 0x57}, + {'X', 0x58}, {'Y', 0x59}, {'Z', 0x5a}, {'[', 0x5b}, + {'\\', 0x5c}, {']', 0x5d}, {'^', 0x5e}, {'_', 0x5f}, + {'`', 0x60}, {'a', 0x61}, {'b', 0x62}, {'c', 0x63}, + {'d', 0x64}, {'e', 0x65}, {'f', 0x66}, {'g', 0x67}, + {'h', 0x68}, {'i', 0x69}, {'j', 0x6a}, {'k', 0x6b}, + {'l', 0x6c}, {'m', 0x6d}, {'n', 0x6e}, {'o', 0x6f}, + {'p', 0x70}, {'q', 0x71}, {'r', 0x72}, {'s', 0x73}, + {'t', 0x74}, {'u', 0x75}, {'v', 0x76}, {'w', 0x77}, + {'x', 0x78}, {'y', 0x79}, {'z', 0x7a}, {'{', 0x7b}, + {'|', 0x7c}, {'}', 0x7d}, {'~', 0x7e}, + {0, 0} +}; + + +static CodepageDef cp_zx81[] = +{ + {' ', 0x00}, {'!', 0x00}, {'"', 0x0b}, {'#', 0x0c}, + {'$', 0x0d}, {'%', 0x00}, {'&', 0x00}, {'\'', 0x0b}, + {'(', 0x10}, {')', 0x11}, {'*', 0x17}, {'+', 0x15}, + {',', 0x1a}, {'-', 0x16}, {'.', 0x1b}, {'/', 0x24}, + {'0', 0x1c}, {'1', 0x1d}, {'2', 0x1e}, {'3', 0x1f}, + {'4', 0x20}, {'5', 0x21}, {'6', 0x22}, {'7', 0x23}, + {'8', 0x24}, {'9', 0x25}, {':', 0x0e}, {';', 0x19}, + {'<', 0x12}, {'=', 0x14}, {'>', 0x13}, {'?', 0x0f}, + {'@', 0x97}, {'A', 0xa6}, {'B', 0xa7}, {'C', 0xa8}, + {'D', 0xa9}, {'E', 0xaa}, {'F', 0xab}, {'G', 0xac}, + {'H', 0xad}, {'I', 0xae}, {'J', 0xaf}, {'K', 0xb0}, + {'L', 0xb1}, {'M', 0xb2}, {'N', 0xb3}, {'O', 0xb4}, + {'P', 0xb5}, {'Q', 0xb6}, {'R', 0xb7}, {'S', 0xb8}, + {'T', 0xb9}, {'U', 0xba}, {'V', 0xbb}, {'W', 0xbc}, + {'X', 0xbd}, {'Y', 0xbe}, {'Z', 0xbf}, {'[', 0x10}, + {'\\', 0x24}, {']', 0x11}, {'^', 0xde}, {'_', 0x80}, + {'`', 0x60}, {'a', 0x26}, {'b', 0x27}, {'c', 0x28}, + {'d', 0x29}, {'e', 0x2a}, {'f', 0x2b}, {'g', 0x2c}, + {'h', 0x2d}, {'i', 0x2e}, {'j', 0x2f}, {'k', 0x30}, + {'l', 0x31}, {'m', 0x32}, {'n', 0x33}, {'o', 0x34}, + {'p', 0x35}, {'q', 0x36}, {'r', 0x37}, {'s', 0x38}, + {'t', 0x39}, {'u', 0x3a}, {'v', 0x3b}, {'w', 0x3c}, + {'x', 0x3d}, {'y', 0x3e}, {'z', 0x3f}, {'{', 0x90}, + {'|', 0x00}, {'}', 0x91}, {'~', 0x96}, + {0, 0} +}; + + +static CodepageDef cp_spectrum[] = +{ + {' ', 0x20}, {'!', 0x21}, {'"', 0x22}, {'#', 0x23}, + {'$', 0x24}, {'%', 0x25}, {'&', 0x26}, {'\'', 0x27}, + {'(', 0x28}, {')', 0x29}, {'*', 0x2a}, {'+', 0x2b}, + {',', 0x2c}, {'-', 0x2d}, {'.', 0x2e}, {'/', 0x2f}, + {'0', 0x30}, {'1', 0x31}, {'2', 0x32}, {'3', 0x33}, + {'4', 0x34}, {'5', 0x35}, {'6', 0x36}, {'7', 0x37}, + {'8', 0x38}, {'9', 0x39}, {':', 0x3a}, {';', 0x3b}, + {'<', 0x3c}, {'=', 0x3d}, {'>', 0x3e}, {'?', 0x3f}, + {'@', 0x40}, {'A', 0x41}, {'B', 0x42}, {'C', 0x43}, + {'D', 0x44}, {'E', 0x45}, {'F', 0x46}, {'G', 0x47}, + {'H', 0x48}, {'I', 0x49}, {'J', 0x4a}, {'K', 0x4b}, + {'L', 0x4c}, {'M', 0x4d}, {'N', 0x4e}, {'O', 0x4f}, + {'P', 0x50}, {'Q', 0x51}, {'R', 0x52}, {'S', 0x53}, + {'T', 0x54}, {'U', 0x55}, {'V', 0x56}, {'W', 0x57}, + {'X', 0x58}, {'Y', 0x59}, {'Z', 0x5a}, {'[', 0x5b}, + {'\\', 0x5c}, {']', 0x5d}, {'^', 0x5e}, {'_', 0x5f}, + {'`', 0x27}, {'a', 0x61}, {'b', 0x62}, {'c', 0x63}, + {'d', 0x64}, {'e', 0x65}, {'f', 0x66}, {'g', 0x67}, + {'h', 0x68}, {'i', 0x69}, {'j', 0x6a}, {'k', 0x6b}, + {'l', 0x6c}, {'m', 0x6d}, {'n', 0x6e}, {'o', 0x6f}, + {'p', 0x70}, {'q', 0x71}, {'r', 0x72}, {'s', 0x73}, + {'t', 0x74}, {'u', 0x75}, {'v', 0x76}, {'w', 0x77}, + {'x', 0x78}, {'y', 0x79}, {'z', 0x7a}, {'{', 0x7b}, + {'|', 0x7c}, {'}', 0x7d}, {'~', 0x7e}, + {0, 0} +}; + + +static CodepageDef cp_cbm[] = +{ + {' ', 0x20}, {'!', 0x21}, {'"', 0x22}, {'#', 0x23}, + {'$', 0x24}, {'%', 0x25}, {'&', 0x26}, {'\'', 0x27}, + {'(', 0x28}, {')', 0x29}, {'*', 0x2a}, {'+', 0x2b}, + {',', 0x2c}, {'-', 0x2d}, {'.', 0x2e}, {'/', 0x2f}, + {'0', 0x30}, {'1', 0x31}, {'2', 0x32}, {'3', 0x33}, + {'4', 0x34}, {'5', 0x35}, {'6', 0x36}, {'7', 0x37}, + {'8', 0x38}, {'9', 0x39}, {':', 0x3a}, {';', 0x3b}, + {'<', 0x3c}, {'=', 0x3d}, {'>', 0x3e}, {'?', 0x3f}, + {'@', 0x40}, {'A', 0x41}, {'B', 0x42}, {'C', 0x43}, + {'D', 0x44}, {'E', 0x45}, {'F', 0x46}, {'G', 0x47}, + {'H', 0x48}, {'I', 0x49}, {'J', 0x4a}, {'K', 0x4b}, + {'L', 0x4c}, {'M', 0x4d}, {'N', 0x4e}, {'O', 0x4f}, + {'P', 0x50}, {'Q', 0x51}, {'R', 0x52}, {'S', 0x53}, + {'T', 0x54}, {'U', 0x55}, {'V', 0x56}, {'W', 0x57}, + {'X', 0x58}, {'Y', 0x59}, {'Z', 0x5a}, {'[', 0x5b}, + {'\\', 0x2f}, {']', 0x5d}, {'^', 0x5e}, {'_', 0x60}, + {'`', 0x27}, {'a', 0x41}, {'b', 0x42}, {'c', 0x43}, + {'d', 0x44}, {'e', 0x45}, {'f', 0x46}, {'g', 0x47}, + {'h', 0x48}, {'i', 0x49}, {'j', 0x4a}, {'k', 0x4b}, + {'l', 0x4c}, {'m', 0x4d}, {'n', 0x4e}, {'o', 0x4f}, + {'p', 0x50}, {'q', 0x51}, {'r', 0x52}, {'s', 0x53}, + {'t', 0x54}, {'u', 0x55}, {'v', 0x56}, {'w', 0x57}, + {'x', 0x58}, {'y', 0x59}, {'z', 0x5a}, {'{', 0x5b}, + {'|', 0x7d}, {'}', 0x5d}, {'~', 0x7e}, + {0, 0} +}; + +static CodepageDef *cp_table[] = +{ + cp_ascii, + cp_zx81, + cp_spectrum, + cp_cbm +}; + + +/* ---------------------------------------- INTERFACES +*/ + +const ValueTable *CodepageOptions(void) +{ + return option_set; +} + + +CommandStatus CodepageSetOption(int opt, int argc, char *argv[], + int quoted[], char *err, size_t errsize) +{ + const ValueTable *val; + + CMD_ARGC_CHECK(1); + + switch(opt) + { + case OPT_CODEPAGE: + CMD_TABLE(argv[0], codepage_table, val); + cp = val->value; + break; + + default: + break; + } + + return CMD_OK; +} + + + +int CodepageConvert(int code) +{ + int f; + + for(f = 0; cp_table[cp][f].code; f++) + { + if (cp_table[cp][f].code == code) + { + return cp_table[cp][f].result; + } + } + + return 0; +} + + +/* +vim: ai sw=4 ts=8 expandtab +*/ |