File: isoconv.cc

package info (click to toggle)
multimail 0.52-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,048 kB
  • sloc: cpp: 16,140; ansic: 82; makefile: 73
file content (79 lines) | stat: -rw-r--r-- 2,450 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
 * MultiMail offline mail reader
 * conversion tables ISO 8859-1 <-> IBM codepage 437

 Copyright 1997 Peter Krefting <peter@softwolves.pp.se>,
                Toth Istvan <stoty@vma.bme.hu>
 Copyright 1998-2017 William McBrine <wmcbrine@gmail.com>
 Distributed under the GNU General Public License, version 3 or later. */

/* Original tables by Peter Krefting, modified by William McBrine after
   DOSEmu's video/terminal.h, by Mark D. Rejhon. */

#include "interfac.h"

enum cdirtype {CC_ISOTO437, CC_437TOISO};

bool isoConsole;

const char *dos2isotab =
  "\307\374\351\342\344\340\345\347\352\353\350\357\356\354\304\305"
  "\311\346\306\364\366\362\373\371\377\326\334\242\243\245\120\146"
  "\341\355\363\372\361\321\252\272\277\055\254\275\274\241\253\273"
  ":%&|{{{..{I.'''.``+}-+}}`.**}=**+*+``..**'.#_][~"
  "a\337\254\266{\363\265t\330\364\326\363o\370En"
  "=\261><()\367=\260\267\267%\140\262= ";

const char *iso2dostab =
  "\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217"
  "\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237 "
  "\255\233\234$\235|\025\"c\246\256\252-r-\370\361\3753\'\346\024\371,1"
  "\370\257\254\253/\250AAAA\216\217\222\200E\220EEIIIID\245OOOO\231x"
  "\231UUU\232Y \341\205\240\203a\204\206\221\207\212\202\210\211\215\241"
  "\214\213 \244\225\242\223o\224\366\224\227\243\226\201y \230";

char *charconv(char *buf, cdirtype cdir)
{
    const char *ct = (cdir == CC_ISOTO437) ? iso2dostab : dos2isotab;

    for (char *p = buf; *p; p++) {
        unsigned char c = *p;
        if (c & 0x80)
            *p = ct[c & 0x7f];
    }
    return buf;
}

char *charconv_in(char *buf)
{
    return (isoConsole ? charconv(buf, CC_437TOISO) : buf);
}

char *charconv_out(char *buf)
{
    return (isoConsole ? charconv(buf, CC_ISOTO437) : buf);
}

char *letterconv_in(char *buf)
{
    return (mm.letterList->isLatin() ^ isoConsole) ?
           charconv(buf, isoConsole ? CC_437TOISO : CC_ISOTO437) : buf;
}

char *letterconv_out(char *buf)
{
    return (mm.letterList->isLatin() ^ isoConsole) ?
           charconv(buf, isoConsole ? CC_ISOTO437 : CC_437TOISO) : buf;
}

char *areaconv_in(char *buf)
{
    return (mm.areaList->isLatin() ^ isoConsole) ?
           charconv(buf, isoConsole ? CC_437TOISO : CC_ISOTO437) : buf;
}

char *areaconv_out(char *buf)
{
    return (mm.areaList->isLatin() ^ isoConsole) ?
           charconv(buf, isoConsole ? CC_ISOTO437 : CC_437TOISO) : buf;
}