]> arthur.barton.de Git - netatalk.git/blobdiff - etc/afpd/nls/makecode.c
apply parts of the netbsd build patch by Patrick Welche <prlw1@newn.cam.ac.uk>, mostl...
[netatalk.git] / etc / afpd / nls / makecode.c
index dbe0ef547498a73f57bfa9416ae58b128c92ebd1..9968dbe4061580be1fca898bb6a13a019c233600 100644 (file)
-/* quick-and-dirty way of creating code pages */
+/*
+ * $Id: makecode.c,v 1.8 2003-06-06 20:18:39 srittau Exp $
+ *
+ * quick-and-dirty way of creating code pages
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H */
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <errno.h>
 
 #include <netatalk/endian.h>
 #include "codepage.h"
 
+/* passthrough map */
+static const unsigned char identity_map[] = {
+    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
+    0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F,
+    0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+    0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0x9E, 0x9F,
+    0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
+    0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF,
+    0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7,
+    0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
+    0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
+    0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,
+    0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,
+    0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
+    0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
+    0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,
+    0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
+    0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF,
+};
+
 /* map of cp10000 (mac roman) to iso-latin-1 */
 static const unsigned char mac_to_isolatin1_map[] = {
-0xC4, 0xC5, 0xC7, 0xC9, 0xD1, 0xD6, 0xDC, 0xE1,
-0xE0, 0xE2, 0xE4, 0xE3, 0xE5, 0xE7, 0xE9, 0xE8,
-0xEA, 0xEB, 0xED, 0xEC, 0xEE, 0xEF, 0xF1, 0xF3,
-0xF2, 0xF4, 0xF6, 0xF5, 0xFA, 0xF9, 0xFB, 0xFC,
-0x00, 0xB0, 0xA2, 0xA3, 0xA7, 0xB7, 0xB6, 0xDF,
-0xAE, 0xA9, 0x00, 0xB4, 0xA8, 0x00, 0xC6, 0xD8,
-0x00, 0xB1, 0x00, 0x00, 0xA5, 0xB5, 0xF0, 0x00,
-0x00, 0x00, 0x00, 0xAA, 0xBA, 0x00, 0xE6, 0xF8,
-0xBF, 0xA1, 0xAC, 0x00, 0x00, 0x00, 0x00, 0xAB,
-0xBB, 0x00, 0xA0, 0xC0, 0xC3, 0xD5, 0x00, 0x00,
-0xAD, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x00,
-0xFF, 0x00, 0x00, 0xA4, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0xB8, 0x00, 0x00, 0xC2, 0xCA, 0xC1,
-0xCB, 0xC8, 0xCD, 0xCE, 0xCF, 0xCC, 0xD3, 0xD4,
-0x00, 0xD2, 0xDA, 0xDB, 0xD9 
-/*, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00 */
+    0xC4, 0xC5, 0xC7, 0xC9, 0xD1, 0xD6, 0xDC, 0xE1,
+    0xE0, 0xE2, 0xE4, 0xE3, 0xE5, 0xE7, 0xE9, 0xE8,
+    0xEA, 0xEB, 0xED, 0xEC, 0xEE, 0xEF, 0xF1, 0xF3,
+    0xF2, 0xF4, 0xF6, 0xF5, 0xFA, 0xF9, 0xFB, 0xFC,
+    0x00, 0xB0, 0xA2, 0xA3, 0xA7, 0xB7, 0xB6, 0xDF,
+    0xAE, 0xA9, 0x00, 0xB4, 0xA8, 0x00, 0xC6, 0xD8,
+    0x00, 0xB1, 0x00, 0x00, 0xA5, 0xB5, 0xF0, 0x00,
+    0x00, 0x00, 0x00, 0xAA, 0xBA, 0x00, 0xE6, 0xF8,
+    0xBF, 0xA1, 0xAC, 0x00, 0x00, 0x00, 0x00, 0xAB,
+    0xBB, 0x00, 0xA0, 0xC0, 0xC3, 0xD5, 0x00, 0x00,
+    0xAD, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x00,
+    0xFF, 0x00, 0x00, 0xA4, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0xB8, 0x00, 0x00, 0xC2, 0xCA, 0xC1,
+    0xCB, 0xC8, 0xCD, 0xCE, 0xCF, 0xCC, 0xD3, 0xD4,
+    0x00, 0xD2, 0xDA, 0xDB, 0xD9
+    /*, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00 */
+};
+
+/* map of cp10000 (mac roman) to iso-latin-1 adapted */
+static const unsigned char mac_to_isolatin1_adapted_map[] = {
+    0xC4, 0xC5, 0xC7, 0xC9, 0xD1, 0xD6, 0xDC, 0xE1,
+    0xE0, 0xE2, 0xE4, 0xE3, 0xE5, 0xE7, 0xE9, 0xE8,
+    0xEA, 0xEB, 0xED, 0xEC, 0xEE, 0xEF, 0xF1, 0xF3,
+    0xF2, 0xF4, 0xF6, 0xF5, 0xFA, 0xF9, 0xFB, 0xFC,
+    0x00, 0xB0, 0xA2, 0xA3, 0xA7, 0xB7, 0xB6, 0xDF,
+    0xAE, 0xA9, 0xFE, 0xB4, 0xA8, 0x00, 0xC6, 0xD8,
+    0x00, 0xB1, 0x00, 0x00, 0xA5, 0xB5, 0xF0, 0x00,
+    0x00, 0x00, 0x00, 0xAA, 0xBA, 0x00, 0xE6, 0xF8,
+    0xBF, 0xA1, 0xAC, 0x00, 0xFD, 0x00, 0x00, 0xAB,
+    0xBB, 0x00, 0xA0, 0xC0, 0xC3, 0xD5, 0x00, 0x00,
+    0xAD, 0xAF, 0xB2, 0xB3, 0xDD, 0xDE, 0xF7, 0xB0,
+    0xFF, 0x00, 0x00, 0xA4, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0xB8, 0x00, 0x00, 0xC2, 0xCA, 0xC1,
+    0xCB, 0xC8, 0xCD, 0xCE, 0xCF, 0xCC, 0xD3, 0xD4,
+    0x00, 0xD2, 0xDA, 0xDB, 0xD9
+    /*, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+      0x00, 0x00, 0x00, 0x00, 0x00 */
 };
 
 /* Map of CP10000 (Mac Roman) to MSDOS CP 437 */
 static const unsigned char mac_to_cp437_map[] = {
-0x8e, 0x8f, 0x80, 0x90, 0xa5, 0x99, 0x9a, 0xa0, 
-0x85, 0x83, 0x84, 0xe0, 0x86, 0x87, 0x82, 0x8a,
-0x88, 0x89, 0xa1, 0x8d, 0x8c, 0x8b, 0xa4, 0xa2, 
-0x95, 0x93, 0x94, 0xe5, 0xa3, 0x97, 0x96, 0x81,
-0xc5, 0xf8, 0x9b, 0x9c, 0xb6, 0xf9, 0xb8, 0xe1, 
-0xc9, 0xe9, 0xcb, 0xd9, 0xc0, 0xd8, 0x92, 0xe8,
-0xec, 0xf1, 0xf3, 0xf2, 0x9d, 0xe6, 0xeb, 0xe4, 
-0xef, 0xe3, 0xf4, 0xa6, 0xa7, 0xea, 0x91, 0xed,
-0xa8, 0xad, 0xaa, 0xfb, 0x9f, 0xf7, 0xdd, 0xae, 
-0xaf, 0xb0, 0xff, 0xd6, 0xd2, 0xb1, 0xb2, 0xb7,
-0xb4, 0xc4, 0xb5, 0xb9, 0xba, 0xbb, 0xf6, 0xbc, 
-0x98, 0xbd, 0xf5, 0xfe, 0xbe, 0xbf, 0xc1, 0xc2,
-0xce, 0xfa, 0xc3, 0xc6, 0xc7, 0xc8, 0xee, 0xca, 
-0xcc, 0xcd, 0xb3, 0xd7, 0xcf, 0xd0, 0xd1, 0xd3,
-0xdb, 0xda, 0xa9, 0xab, 0xac, 0xd4, 0xd5, 0xdc, 
-0xde, 0xdf, 0xfc, 0xfd, 0xe7, 0xe2, 0xf0, 0x9e
+    0x8e, 0x8f, 0x80, 0x90, 0xa5, 0x99, 0x9a, 0xa0,
+    0x85, 0x83, 0x84, 0xe0, 0x86, 0x87, 0x82, 0x8a,
+    0x88, 0x89, 0xa1, 0x8d, 0x8c, 0x8b, 0xa4, 0xa2,
+    0x95, 0x93, 0x94, 0xe5, 0xa3, 0x97, 0x96, 0x81,
+    0xc5, 0xf8, 0x9b, 0x9c, 0xb6, 0xf9, 0xb8, 0xe1,
+    0xc9, 0xe9, 0xcb, 0xd9, 0xc0, 0xd8, 0x92, 0xe8,
+    0xec, 0xf1, 0xf3, 0xf2, 0x9d, 0xe6, 0xeb, 0xe4,
+    0xef, 0xe3, 0xf4, 0xa6, 0xa7, 0xea, 0x91, 0xed,
+    0xa8, 0xad, 0xaa, 0xfb, 0x9f, 0xf7, 0xdd, 0xae,
+    0xaf, 0xb0, 0xff, 0xd6, 0xd2, 0xb1, 0xb2, 0xb7,
+    0xb4, 0xc4, 0xb5, 0xb9, 0xba, 0xbb, 0xf6, 0xbc,
+    0x98, 0xbd, 0xf5, 0xfe, 0xbe, 0xbf, 0xc1, 0xc2,
+    0xce, 0xfa, 0xc3, 0xc6, 0xc7, 0xc8, 0xee, 0xca,
+    0xcc, 0xcd, 0xb3, 0xd7, 0xcf, 0xd0, 0xd1, 0xd3,
+    0xdb, 0xda, 0xa9, 0xab, 0xac, 0xd4, 0xd5, 0xdc,
+    0xde, 0xdf, 0xfc, 0xfd, 0xe7, 0xe2, 0xf0, 0x9e
 };
 
 /* Map of CP10000 (Mac Roman) to MSDOS CP 850 */
 static const unsigned char mac_to_cp850_map[] = {
-0x8e, 0x8f, 0x80, 0x90, 0xa5, 0x99, 0x9a, 0xa0,
-0x85, 0x83, 0x84, 0xc6, 0x86, 0x87, 0x82, 0x8a,
-0x88, 0x89, 0xa1, 0x8d, 0x8c, 0x8b, 0xa4, 0xa2,
-0x95, 0x93, 0x94, 0xe4, 0xa3, 0x97, 0x96, 0x81,
-0xc5, 0xf8, 0xbd, 0x9c, 0xf5, 0xb0, 0xf4, 0xe1,
-0xa9, 0xb8, 0xb1, 0xef, 0xf9, 0xca, 0x92, 0x9d,
-0xb2, 0xf1, 0xb3, 0xb4, 0xbe, 0xe6, 0xd0, 0xba,
-0xbb, 0xcb, 0xdd, 0xa6, 0xa7, 0xbc, 0x91, 0x9b,
-0xa8, 0xad, 0xaa, 0xd9, 0x9f, 0xf2, 0xfe, 0xae,
-0xaf, 0xdc, 0xff, 0xb7, 0xc7, 0xe5, 0xc0, 0xc1,
-0xc2, 0xc4, 0xc3, 0x9e, 0xab, 0xac, 0xf6, 0xbf,
-0x98, 0xed, 0xc8, 0xcf, 0xc9, 0xcc, 0xcd, 0xce,
-0xd1, 0xfa, 0xd5, 0xda, 0xdb, 0xb6, 0xd2, 0xb5,
-0xd3, 0xd4, 0xd6, 0xd7, 0xd8, 0xde, 0xe0, 0xe2,
-0xf0, 0xe3, 0xe9, 0xea, 0xeb, 0xfb, 0xdf, 0xe7,
-0xee, 0xe8, 0xec, 0xf3, 0xf7, 0xfc, 0xfd, 0xb9
+    0x8e, 0x8f, 0x80, 0x90, 0xa5, 0x99, 0x9a, 0xa0,
+    0x85, 0x83, 0x84, 0xc6, 0x86, 0x87, 0x82, 0x8a,
+    0x88, 0x89, 0xa1, 0x8d, 0x8c, 0x8b, 0xa4, 0xa2,
+    0x95, 0x93, 0x94, 0xe4, 0xa3, 0x97, 0x96, 0x81,
+    0xc5, 0xf8, 0xbd, 0x9c, 0xf5, 0xb0, 0xf4, 0xe1,
+    0xa9, 0xb8, 0xb1, 0xef, 0xf9, 0xca, 0x92, 0x9d,
+    0xb2, 0xf1, 0xb3, 0xb4, 0xbe, 0xe6, 0xd0, 0xba,
+    0xbb, 0xcb, 0xdd, 0xa6, 0xa7, 0xbc, 0x91, 0x9b,
+    0xa8, 0xad, 0xaa, 0xd9, 0x9f, 0xf2, 0xfe, 0xae,
+    0xaf, 0xdc, 0xff, 0xb7, 0xc7, 0xe5, 0xc0, 0xc1,
+    0xc2, 0xc4, 0xc3, 0x9e, 0xab, 0xac, 0xf6, 0xbf,
+    0x98, 0xed, 0xc8, 0xcf, 0xc9, 0xcc, 0xcd, 0xce,
+    0xd1, 0xfa, 0xd5, 0xda, 0xdb, 0xb6, 0xd2, 0xb5,
+    0xd3, 0xd4, 0xd6, 0xd7, 0xd8, 0xde, 0xe0, 0xe2,
+    0xf0, 0xe3, 0xe9, 0xea, 0xeb, 0xfb, 0xdf, 0xe7,
+    0xee, 0xe8, 0xec, 0xf3, 0xf7, 0xfc, 0xfd, 0xb9
+};
+
+
+
+/* Map of CP10000 (Mac Roman) to koi8-r */
+static const unsigned char mac_to_koi8_r_map[] = {
+    225, 226, 247, 231, 228, 229, 246, 250,
+    233, 234, 235, 236, 237, 238, 239, 240,
+    242, 243, 244, 245, 230, 232, 227, 254,
+    251, 253, 255, 249, 248, 252, 224, 241,
+    160, 161, 162, 163, 164, 165, 166, 167,
+    168, 191, 170, 171, 172, 173, 174, 175,
+    176, 177, 178, 179, 180, 181, 182, 183,
+    184, 185, 186, 187, 188, 189, 190, 191,
+    192, 193, 194, 195, 196, 197, 198, 199,
+    200, 201, 202, 203, 204, 205, 206, 207,
+    208, 209, 210, 211, 212, 213, 214, 215,
+    216, 217, 218, 219, 220, 179, 163, 209,
+    193, 194, 215, 199, 196, 197, 214, 218,
+    201, 202, 203, 204, 205, 206, 207, 208,
+    210, 211, 212, 213, 198, 200, 195, 222,
+    219, 221, 223, 217, 216, 220, 192, 255
 };
 
 struct mac_code {
-  char *m_name;
-  const unsigned char *m_map; 
-  u_int16_t m_len;
-  const char *m_id;
+    char *m_name;
+    const unsigned char *m_map;
+    u_int16_t m_len;
+    const char *m_id;
 };
 
 static struct mac_code names[] = {
-  {"maccode.437", mac_to_cp437_map, sizeof(mac_to_cp437_map), "cp437"},
-  {"maccode.850", mac_to_cp850_map, sizeof(mac_to_cp850_map), "cp850"},
-  {"maccode.iso8859-1", mac_to_isolatin1_map, 
-   sizeof(mac_to_isolatin1_map), "iso8859-1"},
-  {NULL, NULL, 0, NULL}
+    {"maccode.identity", identity_map, sizeof(identity_map), "identity"},
+    {"maccode.437", mac_to_cp437_map, sizeof(mac_to_cp437_map), "cp437"},
+    {"maccode.850", mac_to_cp850_map, sizeof(mac_to_cp850_map), "cp850"},
+    {"maccode.iso8859-1", mac_to_isolatin1_map, sizeof(mac_to_isolatin1_map), "iso8859-1"},
+    {"maccode.iso8859-1.adapted", mac_to_isolatin1_adapted_map, sizeof(mac_to_isolatin1_adapted_map), "iso8859-1-adapted"},
+    {"maccode.koi8-r",mac_to_koi8_r_map,sizeof(mac_to_koi8_r_map),"koi8-r"},
+    {NULL, NULL, 0, NULL}
 };
 
 int main(int argc, char **argv)
 {
-  unsigned char buf[CODEPAGE_FILE_HEADER_SIZE];
-  u_int16_t id;
-  int i, j;
-  FILE *fp;
-  
-  for (i = 0; names[i].m_name; i++) {
+    unsigned char buf[CODEPAGE_FILE_HEADER_SIZE];
+    u_int16_t id;
+    int i, j;
+    FILE *fp;
+
+    if (argc != 2) {
+        fprintf(stderr, "Usage: %s MACCODE\n", argv[0]);
+        return 1;
+    }
+
+    for (i = 0; names[i].m_name; i++) {
+        if (!strcmp(names[i].m_name, argv[1]))
+            break;
+    }
+
+    if (!names[i].m_name) {
+        fprintf(stderr, "unknown codepage\n");
+        return 1;
+    }
+
+
     if ((fp = fopen(names[i].m_name, "w")) == NULL) {
-      fprintf(stderr, "can't open %s\n", names[i].m_name);
-      continue;
+        fprintf(stderr, "can't open %s: %s\n",
+                names[i].m_name, strerror(errno));
+        return 1;
     }
 
+    memset(buf, 0, CODEPAGE_FILE_HEADER_SIZE);
+
     id = htons(CODEPAGE_FILE_ID); /* file id */
     memcpy(buf, &id, sizeof(id));
     *(buf + 2) = CODEPAGE_FILE_VERSION; /* version */
     if ((j = strlen(names[i].m_id)) & 1) /* pad to even boundary */
-      j++;
+        j++;
     *(buf + 3) = j; /* length of name */
 
-    *(buf + 4) = 1; /* default quantum. this should be modified to 
-                    * deal with multibyte characters */
+    *(buf + 4) = 1; /* default quantum. this should be modified to
+                     * deal with multibyte characters */
 
     /* rules */
     *(buf + 5) = CODEPAGE_RULE_MTOU | CODEPAGE_RULE_UTOM;
 
     /* offset to data */
-    id = htons(CODEPAGE_FILE_HEADER_SIZE + j); 
+    id = htons(CODEPAGE_FILE_HEADER_SIZE + j);
     memcpy(buf + 6, &id, sizeof(id));
 
     /* size of data */
-    id = htons(names[i].m_len); 
-    memcpy(buf + 7, &id, sizeof(id));
+    id = htons(names[i].m_len);
+    memcpy(buf + 8, &id, sizeof(id));
 
     /* write it out */
     fwrite(buf, CODEPAGE_FILE_HEADER_SIZE, 1, fp);
 
     /* we either keep or drop the null byte to keep the name on an
-       even boundary */
-    fwrite(names[i].m_id, j, 1, fp); 
-    
+     * even boundary */
+    fwrite(names[i].m_id, j, 1, fp);
+
     /* we typically only map characters > 0x7F */
     for (j = 0; j < names[i].m_len; j++) {
-      buf[0] = CODEPAGE_RULE_MTOU | CODEPAGE_RULE_UTOM;
-      buf[1] = j + 0x80;
-      buf[2] = names[i].m_map[j];
-      fwrite(buf, 3, 1, fp);
+        buf[0] = CODEPAGE_RULE_MTOU | CODEPAGE_RULE_UTOM;
+        buf[1] = j + 0x80;
+        buf[2] = names[i].m_map[j];
+        fwrite(buf, 3, 1, fp);
     }
     fclose(fp);
-  }
 
-  return 0;
+    return 0;
 }