home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / recode.zip / RECODE.C < prev    next >
C/C++ Source or Header  |  1995-08-31  |  29KB  |  974 lines

  1. #include <io.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6.    // Function Prototypes
  7.  
  8. extern int main ( int argc, char *argv[] ) ;
  9.  
  10.  
  11.    // Graphics Character Global Identifiers (IBM)
  12.  
  13. enum GCGID {
  14.    SS000000 = 1,
  15.    SS010000,
  16.    SS020000,
  17.    SS030000,
  18.    SS040000,
  19.    SS050000,
  20.    SM570000,
  21.    SM570001,
  22.    SM750000,
  23.    SM750002,
  24.    SM280000,
  25.    SM290000,
  26.    SM930000,
  27.    SM910000,
  28.    SM690000,
  29.    SM590000,
  30.    SM630000,
  31.    SM760000,
  32.    SP330000,
  33.    SM250000,
  34.    SM240000,
  35.    SM700000,
  36.    SM770000,
  37.    SM320000,
  38.    SM330000,
  39.    SM310000,
  40.    SM300000,
  41.    SA420000,
  42.    SM780000,
  43.    SM600000,
  44.    SV040000,
  45.    SP010000,
  46.    SP020000,
  47.    SP040000,
  48.    SM010000,
  49.    SC030000,
  50.    SM020000,
  51.    SM030000,
  52.    SP050000,
  53.    SP060000,
  54.    SP070000,
  55.    SM040000,
  56.    SA010000,
  57.    SP080000,
  58.    SP100000,
  59.    SP110000,
  60.    SP120000,
  61.    ND100000,
  62.    ND010000,
  63.    ND020000,
  64.    ND030000,
  65.    ND040000,
  66.    ND050000,
  67.    ND060000,
  68.    ND070000,
  69.    ND080000,
  70.    ND090000,
  71.    SP130000,
  72.    SP140000,
  73.    SA030000,
  74.    SA040000,
  75.    SA050000,
  76.    SP150000,
  77.    SM050000,
  78.    LA020000,
  79.    LB020000,
  80.    LC020000,
  81.    LD020000,
  82.    LE020000,
  83.    LF020000,
  84.    LG020000,
  85.    LH020000,
  86.    LI020000,
  87.    LJ020000,
  88.    LK020000,
  89.    LL020000,
  90.    LM020000,
  91.    LN020000,
  92.    LO020000,
  93.    LP020000,
  94.    LQ020000,
  95.    LR020000,
  96.    LS020000,
  97.    LT020000,
  98.    LU020000,
  99.    LV020000,
  100.    LW020000,
  101.    LX020000,
  102.    LY020000,
  103.    LZ020000,
  104.    SM060000,
  105.    SM070000,
  106.    SM080000,
  107.    SD150000,
  108.    SP090000,
  109.    SD130000,
  110.    LA010000,
  111.    LB010000,
  112.    LC010000,
  113.    LD010000,
  114.    LE010000,
  115.    LF010000,
  116.    LG010000,
  117.    LH010000,
  118.    LI010000,
  119.    LJ010000,
  120.    LK010000,
  121.    LL010000,
  122.    LM010000,
  123.    LN010000,
  124.    LO010000,
  125.    LP010000,
  126.    LQ010000,
  127.    LR010000,
  128.    LS010000,
  129.    LT010000,
  130.    LU010000,
  131.    LV010000,
  132.    LW010000,
  133.    LX010000,
  134.    LY010000,
  135.    LZ010000,
  136.    SM110000,
  137.    SM130000,
  138.    SM140000,
  139.    SD190000,
  140.    SM790000,
  141.    LC420000,
  142.    LU170000,
  143.    LE110000,
  144.    LA150000,
  145.    LA170000,
  146.    LA130000,
  147.    LA270000,
  148.    LC410000,
  149.    LE150000,
  150.    LE170000,
  151.    LE130000,
  152.    LI170000,
  153.    LI150000,
  154.    LI130000,
  155.    LA180000,
  156.    LA280000,
  157.    LE120000,
  158.    LA510000,
  159.    LA520000,
  160.    LO150000,
  161.    LO170000,
  162.    LO130000,
  163.    LU150000,
  164.    LU130000,
  165.    LY170000,
  166.    LO180000,
  167.    LU180000,
  168.    LO610000,
  169.    SC020000,
  170.    LO620000,
  171.    SA070000,
  172.    SC070000,
  173.    LA110000,
  174.    LI110000,
  175.    LO110000,
  176.    LU110000,
  177.    LN190000,
  178.    LN200000,
  179.    SM210000,
  180.    SM200000,
  181.    SP160000,
  182.    SM530000,
  183.    SM660000,
  184.    NF010000,
  185.    NF040000,
  186.    SP030000,
  187.    SP170000,
  188.    SP180000,
  189.    SF140000,
  190.    SF150000,
  191.    SF160000,
  192.    SF110000,
  193.    SF090000,
  194.    LA120000,
  195.    LA160000,
  196.    LA140000,
  197.    SM520000,
  198.    SF230000,
  199.    SF240000,
  200.    SF250000,
  201.    SF260000,
  202.    SC040000,
  203.    SC050000,
  204.    SF030000,
  205.    SF020000,
  206.    SF070000,
  207.    SF060000,
  208.    SF080000,
  209.    SF100000,
  210.    SF050000,
  211.    LA190000,
  212.    LA200000,
  213.    SF380000,
  214.    SF390000,
  215.    SF400000,
  216.    SF410000,
  217.    SF420000,
  218.    SF430000,
  219.    SF440000,
  220.    SC010000,
  221.    LD630000,
  222.    LD620000,
  223.    LE160000,
  224.    LE180000,
  225.    LE140000,
  226.    LI610000,
  227.    LI120000,
  228.    LI160000,
  229.    LI180000,
  230.    SF040000,
  231.    SF010000,
  232.    SF610000,
  233.    SF570000,
  234.    SM650000,
  235.    LI140000,
  236.    SF600000,
  237.    LO120000,
  238.    LS610000,
  239.    LO160000,
  240.    LO140000,
  241.    LO190000,
  242.    LO200000,
  243.    SM170000,
  244.    LT630000,
  245.    LT640000,
  246.    LU120000,
  247.    LU160000,
  248.    LU140000,
  249.    LY110000,
  250.    LY120000,
  251.    SM150000,
  252.    SD110000,
  253.    SP320000,
  254.    SA020000,
  255.    SM100000,
  256.    NF050000,
  257.    SM250000_D,
  258.    SM240000_D,
  259.    SA060000,
  260.    SD410000,
  261.    SM190000,
  262.    SD170000,
  263.    SD630000,
  264.    ND011000,
  265.    ND031000,
  266.    ND021000,
  267.    SM470000,
  268.    SP300000,
  269.    SC060000,
  270.    SM680000,
  271.    SF190000,
  272.    SF200000,
  273.    SF210000,
  274.    SF220000,
  275.    SF270000,
  276.    SF280000,
  277.    SF360000,
  278.    SF370000,
  279.    SF450000,
  280.    SF460000,
  281.    SF470000,
  282.    SF480000,
  283.    SF490000,
  284.    SF500000,
  285.    SF510000,
  286.    SF520000,
  287.    SF530000,
  288.    SF540000,
  289.    SF580000,
  290.    SF590000,
  291.    GA010000,
  292.    GG020000,
  293.    GP010000,
  294.    GS020000,
  295.    GS010000,
  296.    GT010000,
  297.    GF020000,
  298.    GT620000,
  299.    GO320000,
  300.    GD010000,
  301.    SA450000,
  302.    GF010000,
  303.    GE010000,
  304.    SA380000,
  305.    SA480000,
  306.    SA530000,
  307.    SA520000,
  308.    SS260000,
  309.    SS270000,
  310.    SA700000,
  311.    SA790000,
  312.    SA800000,
  313.    LN011000,
  314.    SD310000,
  315.    SD230000,
  316.    SD290000,
  317.    SD270000,
  318.    SD250000,
  319.    SD430000,
  320.    SD210000,
  321.    SP190000,
  322.    SP200000,
  323.    SP210000,
  324.    SP220000,
  325.    SS680000,
  326.    SM900000,
  327.    SD150000_D,
  328.    SD190000_D,
  329.    SP260000,
  330.    SP230000,
  331.    SV520000,
  332.    SM340000,
  333.    SM350000,
  334.    SD150100,
  335.    SM560000,
  336.    LS220000,
  337.    SP270000,
  338.    LO520000,
  339.    SD190100,
  340.    SM540000,
  341.    LS210000,
  342.    SP280000,
  343.    LO510000,
  344.    LY180000,
  345.    LG230000,
  346.    LG240000,
  347.    LI300000,
  348.    LS410000,
  349.    LS420000,
  350.    LA230000,
  351.    LA240000,
  352.    LA430000,
  353.    LA440000,
  354.    LC110000,
  355.    LC120000,
  356.    LC210000,
  357.    LC220000,
  358.    LD210000,
  359.    LD220000,
  360.    LD610000,
  361.    LE210000,
  362.    LE220000,
  363.    LE430000,
  364.    LE440000,
  365.    LL110000,
  366.    LL120000,
  367.    LL210000,
  368.    LL220000,
  369.    LL610000,
  370.    LL620000,
  371.    LN110000,
  372.    LN120000,
  373.    LN210000,
  374.    LN220000,
  375.    LO250000,
  376.    LO260000,
  377.    LR110000,
  378.    LR120000,
  379.    LR210000,
  380.    LR220000,
  381.    LS110000,
  382.    LS120000,
  383.    LT210000,
  384.    LT220000,
  385.    LT410000,
  386.    LT420000,
  387.    LU250000,
  388.    LU260000,
  389.    LU270000,
  390.    LU280000,
  391.    LZ110000,
  392.    LZ120000,
  393.    LZ210000,
  394.    LZ220000,
  395.    LZ290000,
  396.    LZ300000
  397. } ;
  398.  
  399.  
  400.    // Codepage 437 - United States PC
  401.  
  402. unsigned CodePage437 [256] = {
  403.    0,          SS000000,  SS010000,  SS020000,
  404.    SS030000,  SS040000,  SS050000,  SM570000,
  405.    SM570001,  SM750000,  SM750002,  SM280000,
  406.    SM290000,  SM930000,  SM910000,  SM690000,
  407.    SM590000,  SM630000,  SM760000,  SP330000,
  408.    SM250000,  SM240000,  SM700000,  SM770000,
  409.    SM320000,  SM330000,  SM310000,  SM300000,
  410.    SA420000,  SM780000,  SM600000,  SV040000,
  411.    SP010000,  SP020000,  SP040000,  SM010000,
  412.    SC030000,  SM020000,  SM030000,  SP050000,
  413.    SP060000,  SP070000,  SM040000,  SA010000,
  414.    SP080000,  SP100000,  SP110000,  SP120000,
  415.    ND100000,  ND010000,  ND020000,  ND030000,
  416.    ND040000,  ND050000,  ND060000,  ND070000,
  417.    ND080000,  ND090000,  SP130000,  SP140000,
  418.    SA030000,  SA040000,  SA050000,  SP150000,
  419.    SM050000,  LA020000,  LB020000,  LC020000,
  420.    LD020000,  LE020000,  LF020000,  LG020000,
  421.    LH020000,  LI020000,  LJ020000,  LK020000,
  422.    LL020000,  LM020000,  LN020000,  LO020000,
  423.    LP020000,  LQ020000,  LR020000,  LS020000,
  424.    LT020000,  LU020000,  LV020000,  LW020000,
  425.    LX020000,  LY020000,  LZ020000,  SM060000,
  426.    SM070000,  SM080000,  SD150000,  SP090000,
  427.    SD130000,  LA010000,  LB010000,  LC010000,
  428.    LD010000,  LE010000,  LF010000,  LG010000,
  429.    LH010000,  LI010000,  LJ010000,  LK010000,
  430.    LL010000,  LM010000,  LN010000,  LO010000,
  431.    LP010000,  LQ010000,  LR010000,  LS010000,
  432.    LT010000,  LU010000,  LV010000,  LW010000,
  433.    LX010000,  LY010000,  LZ010000,  SM110000,
  434.    SM130000,  SM140000,  SD190000,  SM790000,
  435.    LC420000,  LU170000,  LE110000,  LA150000,  // 0x80
  436.    LA170000,  LA130000,  LA270000,  LC410000,
  437.    LE150000,  LE170000,  LE130000,  LI170000,
  438.    LI150000,  LI130000,  LA180000,  LA280000,
  439.    LE120000,  LA510000,  LA520000,  LO150000,  // 0x90
  440.    LO170000,  LO130000,  LU150000,  LU130000,
  441.    LY170000,  LO180000,  LU180000,  SC040000,
  442.    SC020000,  SC050000,  SC060000,  SC070000,
  443.    LA110000,  LI110000,  LO110000,  LU110000,  // 0xA0
  444.    LN190000,  LN200000,  SM210000,  SM200000,
  445.    SM680000,  SM530000,  SM660000,  NF010000,
  446.    SP010000,  SP030000,  SP170000,  SP180000,
  447.    SF140000,  SF150000,  SF160000,  SF110000,  // 0xB0
  448.    SF090000,  SF190000,  SF200000,  SF210000,
  449.    SF220000,  SF230000,  SF240000,  SF250000,
  450.    SF260000,  SF270000,  SF280000,  SF030000,
  451.    SF020000,  SF070000,  SF060000,  SF080000,  // 0xC0
  452.    SF100000,  SF050000,  SF360000,  SF370000,
  453.    SF380000,  SF390000,  SF400000,  SF410000,
  454.    SF420000,  SF430000,  SF440000,  SF450000,
  455.    SF460000,  SF470000,  SF480000,  SF490000,  // 0xD0
  456.    SF500000,  SF510000,  SF520000,  SF530000,
  457.    SF540000,  SF040000,  SF010000,  SF610000,
  458.    SF570000,  SF580000,  SF590000,  SF600000,
  459.    GA010000,  LS610000,  GG020000,  GP010000,  // 0xE0
  460.    GS020000,  GS010000,  SM170000,  GT010000,
  461.    GF020000,  GT620000,  GO320000,  GD010000,
  462.    SA450000,  GF010000,  GE010000,  SA380000,
  463.    SA480000,  SA020000,  SA530000,  SA520000,  // 0xF0
  464.    SS260000,  SS270000,  SA060000,  SA700000,
  465.    SM190000,  SA790000,  SD630000,  SA800000,
  466.    LN011000,  ND021000,  SM470000,  SP300000,
  467. } ;
  468.  
  469.    // Codepage 819 - ISO-8859-1 Standard
  470.  
  471. unsigned CodePage819 [256] = {
  472.    0,          SS000000,  SS010000,  SS020000,
  473.    SS030000,  SS040000,  SS050000,  SM570000,
  474.    SM570001,  SM750000,  SM750002,  SM280000,
  475.    SM290000,  SM930000,  SM910000,  SM690000,
  476.    SM590000,  SM630000,  SM760000,  SP330000,
  477.    SM250000,  SM240000,  SM700000,  SM770000,
  478.    SM320000,  SM330000,  SM310000,  SM300000,
  479.    SA420000,  SM780000,  SM600000,  SV040000,
  480.    SP010000,  SP020000,  SP040000,  SM010000,
  481.    SC030000,  SM020000,  SM030000,  SP050000,
  482.    SP060000,  SP070000,  SM040000,  SA010000,
  483.    SP080000,  SP100000,  SP110000,  SP120000,
  484.    ND100000,  ND010000,  ND020000,  ND030000,
  485.    ND040000,  ND050000,  ND060000,  ND070000,
  486.    ND080000,  ND090000,  SP130000,  SP140000,
  487.    SA030000,  SA040000,  SA050000,  SP150000,
  488.    SM050000,  LA020000,  LB020000,  LC020000,
  489.    LD020000,  LE020000,  LF020000,  LG020000,
  490.    LH020000,  LI020000,  LJ020000,  LK020000,
  491.    LL020000,  LM020000,  LN020000,  LO020000,
  492.    LP020000,  LQ020000,  LR020000,  LS020000,
  493.    LT020000,  LU020000,  LV020000,  LW020000,
  494.    LX020000,  LY020000,  LZ020000,  SM060000,
  495.    SM070000,  SM080000,  SD150000,  SP090000,
  496.    SD130000,  LA010000,  LB010000,  LC010000,
  497.    LD010000,  LE010000,  LF010000,  LG010000,
  498.    LH010000,  LI010000,  LJ010000,  LK010000,
  499.    LL010000,  LM010000,  LN010000,  LO010000,
  500.    LP010000,  LQ010000,  LR010000,  LS010000,
  501.    LT010000,  LU010000,  LV010000,  LW010000,
  502.    LX010000,  LY010000,  LZ010000,  SM110000,
  503.    SM130000,  SM140000,  SD190000,  SM790000,
  504.    SP010000,  SP010000,  SP010000,  SP010000,  // 0x80
  505.    SP010000,  SP010000,  SP010000,  SP010000,
  506.    SP010000,  SP010000,  SP010000,  SP010000,
  507.    SP010000,  SP010000,  SP010000,  SP010000,
  508.    SP010000,  SP010000,  SP010000,  SP010000,  // 0x90
  509.    SP010000,  SP010000,  SP010000,  SP010000,
  510.    SP010000,  SP010000,  SP010000,  SP010000,
  511.    SP010000,  SP010000,  SP010000,  SP010000,
  512.    SP300000,  SP030000,  SC040000,  SC020000,  // 0xA0
  513.    SC010000,  SC050000,  SM650000,  SM240000,
  514.    SD170000,  SM520000,  SM210000,  SP170000,
  515.    SM660000,  SP320000,  SM530000,  SD310000,
  516.    SM190000,  SA020000,  ND021000,  ND031000,  // 0xB0
  517.    SD110000,  SM170000,  SM250000,  SD290000,
  518.    SD410000,  ND011000,  SM200000,  SP180000,
  519.    NF040000,  NF010000,  NF050000,  SP160000,
  520.    LA140000,  LA120000,  LA160000,  LA200000,  // 0xC0
  521.    LA180000,  LA280000,  LA520000,  LC420000,
  522.    LE140000,  LE120000,  LE160000,  LE180000,
  523.    LI140000,  LI120000,  LI160000,  LI180000,
  524.    LD620000,  LN200000,  LO140000,  LO120000,  // 0xD0
  525.    LO160000,  LO200000,  LO180000,  SA070000,
  526.    LO620000,  LU140000,  LU120000,  LU160000,
  527.    LU180000,  LY120000,  LT640000,  LS610000,
  528.    LA130000,  LA110000,  LA150000,  LA190000,  // 0xE0
  529.    LA170000,  LA270000,  LA510000,  LC410000,
  530.    LE130000,  LE110000,  LE150000,  LE170000,
  531.    LI130000,  LI110000,  LI150000,  LI170000,
  532.    LD630000,  LN190000,  LO130000,  LO110000,  // 0xF0
  533.    LO150000,  LO190000,  LO170000,  SA060000,
  534.    LO610000,  LU130000,  LU110000,  LU150000,
  535.    LU170000,  LY110000,  LT630000,  LY170000,
  536. } ;
  537.  
  538.  
  539.    // Codepage 850 - Multilingual
  540.  
  541. unsigned CodePage850 [256] = {
  542.    0,          SS000000,  SS010000,  SS020000,
  543.    SS030000,  SS040000,  SS050000,  SM570000,
  544.    SM570001,  SM750000,  SM750002,  SM280000,
  545.    SM290000,  SM930000,  SM910000,  SM690000,
  546.    SM590000,  SM630000,  SM760000,  SP330000,
  547.    SM250000,  SM240000,  SM700000,  SM770000,
  548.    SM320000,  SM330000,  SM310000,  SM300000,
  549.    SA420000,  SM780000,  SM600000,  SV040000,
  550.    SP010000,  SP020000,  SP040000,  SM010000,
  551.    SC030000,  SM020000,  SM030000,  SP050000,
  552.    SP060000,  SP070000,  SM040000,  SA010000,
  553.    SP080000,  SP100000,  SP110000,  SP120000,
  554.    ND100000,  ND010000,  ND020000,  ND030000,
  555.    ND040000,  ND050000,  ND060000,  ND070000,
  556.    ND080000,  ND090000,  SP130000,  SP140000,
  557.    SA030000,  SA040000,  SA050000,  SP150000,
  558.    SM050000,  LA020000,  LB020000,  LC020000,
  559.    LD020000,  LE020000,  LF020000,  LG020000,
  560.    LH020000,  LI020000,  LJ020000,  LK020000,
  561.    LL020000,  LM020000,  LN020000,  LO020000,
  562.    LP020000,  LQ020000,  LR020000,  LS020000,
  563.    LT020000,  LU020000,  LV020000,  LW020000,
  564.    LX020000,  LY020000,  LZ020000,  SM060000,
  565.    SM070000,  SM080000,  SD150000,  SP090000,
  566.    SD130000,  LA010000,  LB010000,  LC010000,
  567.    LD010000,  LE010000,  LF010000,  LG010000,
  568.    LH010000,  LI010000,  LJ010000,  LK010000,
  569.    LL010000,  LM010000,  LN010000,  LO010000,
  570.    LP010000,  LQ010000,  LR010000,  LS010000,
  571.    LT010000,  LU010000,  LV010000,  LW010000,
  572.    LX010000,  LY010000,  LZ010000,  SM110000,
  573.    SM130000,  SM140000,  SD190000,  SM790000,
  574.    LC420000,  LU170000,  LE110000,  LA150000,  // 0x80
  575.    LA170000,  LA130000,  LA270000,  LC410000,
  576.    LE150000,  LE170000,  LE130000,  LI170000,
  577.    LI150000,  LI130000,  LA180000,  LA280000,
  578.    LE120000,  LA510000,  LA520000,  LO150000,  // 0x90
  579.    LO170000,  LO130000,  LU150000,  LU130000,
  580.    LY170000,  LO180000,  LU180000,  LO610000,
  581.    SC020000,  LO620000,  SA070000,  SC070000,
  582.    LA110000,  LI110000,  LO110000,  LU110000,  // 0xA0
  583.    LN190000,  LN200000,  SM210000,  SM200000,
  584.    SP160000,  SM530000,  SM660000,  NF010000,
  585.    NF040000,  SP030000,  SP170000,  SP180000,
  586.    SF140000,  SF150000,  SF160000,  SF110000,  // 0xB0
  587.    SF090000,  LA120000,  LA160000,  LA140000,
  588.    SM520000,  SF230000,  SF240000,  SF250000,
  589.    SF260000,  SC040000,  SC050000,  SF030000,
  590.    SF020000,  SF070000,  SF060000,  SF080000,  // 0xC0
  591.    SF100000,  SF050000,  LA190000,  LA200000,
  592.    SF380000,  SF390000,  SF400000,  SF410000,
  593.    SF420000,  SF430000,  SF440000,  SC010000,
  594.    LD630000,  LD620000,  LE160000,  LE180000,  // 0xD0
  595.    LE140000,  LI610000,  LI120000,  LI160000,
  596.    LI180000,  SF040000,  SF010000,  SF610000,
  597.    SF570000,  SM650000,  LI140000,  SF600000,
  598.    LO120000,  LS610000,  LO160000,  LO140000,  // 0xE0
  599.    LO190000,  LO200000,  SM170000,  LT630000,
  600.    LT640000,  LU120000,  LU160000,  LU140000,
  601.    LY110000,  LY120000,  SM150000,  SD110000,
  602.    SP320000,  SA020000,  SM100000,  NF050000,  // 0xF0
  603.    SM250000,  SM240000,  SA060000,  SD410000,
  604.    SM190000,  SD170000,  SD630000,  ND011000,
  605.    ND031000,  ND021000,  SM470000,  SP300000,
  606. } ;
  607.  
  608.  
  609.    // Codepage 860 - Portuguese
  610.  
  611. unsigned CodePage860 [256] = {
  612.    0,          SS000000,  SS010000,  SS020000,
  613.    SS030000,  SS040000,  SS050000,  SM570000,
  614.    SM570001,  SM750000,  SM750002,  SM280000,
  615.    SM290000,  SM930000,  SM910000,  SM690000,
  616.    SM590000,  SM630000,  SM760000,  SP330000,
  617.    SM250000,  SM240000,  SM700000,  SM770000,
  618.    SM320000,  SM330000,  SM310000,  SM300000,
  619.    SA420000,  SM780000,  SM600000,  SV040000,
  620.    SP010000,  SP020000,  SP040000,  SM010000,
  621.    SC030000,  SM020000,  SM030000,  SP050000,
  622.    SP060000,  SP070000,  SM040000,  SA010000,
  623.    SP080000,  SP100000,  SP110000,  SP120000,
  624.    ND100000,  ND010000,  ND020000,  ND030000,
  625.    ND040000,  ND050000,  ND060000,  ND070000,
  626.    ND080000,  ND090000,  SP130000,  SP140000,
  627.    SA030000,  SA040000,  SA050000,  SP150000,
  628.    SM050000,  LA020000,  LB020000,  LC020000,
  629.    LD020000,  LE020000,  LF020000,  LG020000,
  630.    LH020000,  LI020000,  LJ020000,  LK020000,
  631.    LL020000,  LM020000,  LN020000,  LO020000,
  632.    LP020000,  LQ020000,  LR020000,  LS020000,
  633.    LT020000,  LU020000,  LV020000,  LW020000,
  634.    LX020000,  LY020000,  LZ020000,  SM060000,
  635.    SM070000,  SM080000,  SD150000,  SP090000,
  636.    SD130000,  LA010000,  LB010000,  LC010000,
  637.    LD010000,  LE010000,  LF010000,  LG010000,
  638.    LH010000,  LI010000,  LJ010000,  LK010000,
  639.    LL010000,  LM010000,  LN010000,  LO010000,
  640.    LP010000,  LQ010000,  LR010000,  LS010000,
  641.    LT010000,  LU010000,  LV010000,  LW010000,
  642.    LX010000,  LY010000,  LZ010000,  SM110000,
  643.    SM130000,  SM140000,  SD190000,  SM790000,
  644.    LC420000,  LU170000,  LE110000,  LA150000,  // 0x80
  645.    LA170000,  LA130000,  LA120000,  LC410000,
  646.    LE150000,  LE160000,  LE130000,  LI120000,
  647.    LO160000,  LI130000,  LA200000,  LA160000,
  648.    LE120000,  LA140000,  LE140000,  LO150000,  // 0x90
  649.    LO170000,  LO130000,  LU120000,  LU130000,
  650.    LI140000,  LO180000,  LU180000,  SC040000,
  651.    SC020000,  LU140000,  SC060000,  LO120000,
  652.    LA110000,  LI110000,  LO110000,  LU110000,  // 0xA0
  653.    LN190000,  LN200000,  SM210000,  SM200000,
  654.    SM680000,  LO140000,  SM660000,  NF010000,
  655.    SP010000,  SP030000,  SP170000,  SP180000,
  656.    SF140000,  SF150000,  SF160000,  SF110000,  // 0xB0
  657.    SF090000,  SF190000,  SF200000,  SF210000,
  658.    SF220000,  SF230000,  SF240000,  SF250000,
  659.    SF260000,  SF270000,  SF280000,  SF030000,
  660.    SF020000,  SF070000,  SF060000,  SF080000,  // 0xC0
  661.    SF100000,  SF050000,  SF360000,  SF370000,
  662.    SF380000,  SF390000,  SF400000,  SF410000,
  663.    SF420000,  SF430000,  SF440000,  SF450000,
  664.    SF460000,  SF470000,  SF480000,  SF490000,  // 0xD0
  665.    SF500000,  SF510000,  SF520000,  SF530000,
  666.    SF540000,  SF040000,  SF010000,  SF610000,
  667.    SF570000,  SF580000,  SF590000,  SF600000,
  668.    GA010000,  LS610000,  GG020000,  GP010000,  // 0xE0
  669.    GS020000,  GS010000,  SM170000,  GT010000,
  670.    GF020000,  GT620000,  GO320000,  GD010000,
  671.    SA450000,  GF010000,  GE010000,  SA380000,
  672.    SA480000,  SA020000,  SA530000,  SA520000,  // 0xF0
  673.    SS260000,  SS270000,  SA060000,  SA700000,
  674.    SM190000,  SA790000,  SD630000,  SA800000,
  675.    LN011000,  ND021000,  SM470000,  SP300000,
  676. } ;
  677.  
  678.  
  679.    // Codepage 863 - French-Canadian
  680.  
  681. unsigned CodePage863 [256] = {
  682.    0,          SS000000,  SS010000,  SS020000,
  683.    SS030000,  SS040000,  SS050000,  SM570000,
  684.    SM570001,  SM750000,  SM750002,  SM280000,
  685.    SM290000,  SM930000,  SM910000,  SM690000,
  686.    SM590000,  SM630000,  SM760000,  SP330000,
  687.    SM250000,  SM240000,  SM700000,  SM770000,
  688.    SM320000,  SM330000,  SM310000,  SM300000,
  689.    SA420000,  SM780000,  SM600000,  SV040000,
  690.    SP010000,  SP020000,  SP040000,  SM010000,
  691.    SC030000,  SM020000,  SM030000,  SP050000,
  692.    SP060000,  SP070000,  SM040000,  SA010000,
  693.    SP080000,  SP100000,  SP110000,  SP120000,
  694.    ND100000,  ND010000,  ND020000,  ND030000,
  695.    ND040000,  ND050000,  ND060000,  ND070000,
  696.    ND080000,  ND090000,  SP130000,  SP140000,
  697.    SA030000,  SA040000,  SA050000,  SP150000,
  698.    SM050000,  LA020000,  LB020000,  LC020000,
  699.    LD020000,  LE020000,  LF020000,  LG020000,
  700.    LH020000,  LI020000,  LJ020000,  LK020000,
  701.    LL020000,  LM020000,  LN020000,  LO020000,
  702.    LP020000,  LQ020000,  LR020000,  LS020000,
  703.    LT020000,  LU020000,  LV020000,  LW020000,
  704.    LX020000,  LY020000,  LZ020000,  SM060000,
  705.    SM070000,  SM080000,  SD150000,  SP090000,
  706.    SD130000,  LA010000,  LB010000,  LC010000,
  707.    LD010000,  LE010000,  LF010000,  LG010000,
  708.    LH010000,  LI010000,  LJ010000,  LK010000,
  709.    LL010000,  LM010000,  LN010000,  LO010000,
  710.    LP010000,  LQ010000,  LR010000,  LS010000,
  711.    LT010000,  LU010000,  LV010000,  LW010000,
  712.    LX010000,  LY010000,  LZ010000,  SM110000,
  713.    SM130000,  SM140000,  SD190000,  SM790000,
  714.    LC420000,  LU170000,  LE110000,  LA150000,  // 0x80
  715.    LA160000,  LA130000,  SM250000,  LC410000,
  716.    LE150000,  LE170000,  LE130000,  LI170000,
  717.    LI150000,  SA040000,  LA140000,  SM240000,
  718.    LE120000,  LE140000,  LE160000,  LO150000,  // 0x90
  719.    LE180000,  LI180000,  LU150000,  LU130000,
  720.    SC010000,  LO160000,  LU180000,  SC040000,
  721.    SC020000,  LU140000,  LU160000,  SC070000,
  722.    SM650000,  SD110000,  LO110000,  LU110000,  // 0xA0
  723.    SD170000,  SD410000,  ND031000,  SM150000,
  724.    LI160000,  SM530000,  SM660000,  NF010000,
  725.    SP010000,  NF050000,  SP170000,  SP180000,
  726.    SF140000,  SF150000,  SF160000,  SF110000,  // 0xB0
  727.    SF090000,  SF190000,  SF200000,  SF210000,
  728.    SF220000,  SF230000,  SF240000,  SF250000,
  729.    SF260000,  SF270000,  SF280000,  SF030000,
  730.    SF020000,  SF070000,  SF060000,  SF080000,  // 0xC0
  731.    SF100000,  SF050000,  SF360000,  SF370000,
  732.    SF380000,  SF390000,  SF400000,  SF410000,
  733.    SF420000,  SF430000,  SF440000,  SF450000,
  734.    SF460000,  SF470000,  SF480000,  SF490000,  // 0xD0
  735.    SF500000,  SF510000,  SF520000,  SF530000,
  736.    SF540000,  SF040000,  SF010000,  SF610000,
  737.    SF570000,  SF580000,  SF590000,  SF600000,
  738.    GA010000,  LS610000,  GG020000,  GP010000,  // 0xE0
  739.    GS020000,  GS010000,  SM170000,  GT010000,
  740.    GF020000,  GT620000,  GO320000,  GD010000,
  741.    SA450000,  GF010000,  GE010000,  SA380000,
  742.    SA480000,  SA020000,  SA530000,  SA520000,  // 0xF0
  743.    SS260000,  SS270000,  SA060000,  SA700000,
  744.    SM190000,  SA790000,  SD630000,  SA800000,
  745.    LN011000,  ND021000,  SM470000,  SP300000,
  746. } ;
  747.  
  748.  
  749.    // Codepage 865 - Nordic
  750.  
  751. unsigned CodePage865 [256] = {
  752.    0,          SS000000,  SS010000,  SS020000,
  753.    SS030000,  SS040000,  SS050000,  SM570000,
  754.    SM570001,  SM750000,  SM750002,  SM280000,
  755.    SM290000,  SM930000,  SM910000,  SM690000,
  756.    SM590000,  SM630000,  SM760000,  SP330000,
  757.    SM250000,  SM240000,  SM700000,  SM770000,
  758.    SM320000,  SM330000,  SM310000,  SM300000,
  759.    SA420000,  SM780000,  SM600000,  SV040000,
  760.    SP010000,  SP020000,  SP040000,  SM010000,
  761.    SC030000,  SM020000,  SM030000,  SP050000,
  762.    SP060000,  SP070000,  SM040000,  SA010000,
  763.    SP080000,  SP100000,  SP110000,  SP120000,
  764.    ND100000,  ND010000,  ND020000,  ND030000,
  765.    ND040000,  ND050000,  ND060000,  ND070000,
  766.    ND080000,  ND090000,  SP130000,  SP140000,
  767.    SA030000,  SA040000,  SA050000,  SP150000,
  768.    SM050000,  LA020000,  LB020000,  LC020000,
  769.    LD020000,  LE020000,  LF020000,  LG020000,
  770.    LH020000,  LI020000,  LJ020000,  LK020000,
  771.    LL020000,  LM020000,  LN020000,  LO020000,
  772.    LP020000,  LQ020000,  LR020000,  LS020000,
  773.    LT020000,  LU020000,  LV020000,  LW020000,
  774.    LX020000,  LY020000,  LZ020000,  SM060000,
  775.    SM070000,  SM080000,  SD150000,  SP090000,
  776.    SD130000,  LA010000,  LB010000,  LC010000,
  777.    LD010000,  LE010000,  LF010000,  LG010000,
  778.    LH010000,  LI010000,  LJ010000,  LK010000,
  779.    LL010000,  LM010000,  LN010000,  LO010000,
  780.    LP010000,  LQ010000,  LR010000,  LS010000,
  781.    LT010000,  LU010000,  LV010000,  LW010000,
  782.    LX010000,  LY010000,  LZ010000,  SM110000,
  783.    SM130000,  SM140000,  SD190000,  SM790000,
  784.    LC420000,  LU170000,  LE110000,  LA150000,  // 0x80
  785.    LA170000,  LA130000,  LA270000,  LC410000,
  786.    LE150000,  LE170000,  LE130000,  LI170000,
  787.    LI150000,  LI130000,  LA180000,  LA280000,
  788.    LE120000,  LA510000,  LA520000,  LO150000,  // 0x90
  789.    LO170000,  LO130000,  LU150000,  LU130000,
  790.    LY170000,  LO180000,  LU180000,  LO610000,
  791.    SC020000,  LO620000,  SC060000,  SC070000,
  792.    LA110000,  LI110000,  LO110000,  LU110000,  // 0xA0
  793.    LN190000,  LN200000,  SM210000,  SM200000,
  794.    SM680000,  SM530000,  SM660000,  NF010000,
  795.    SP010000,  SP030000,  SP170000,  SC010000,
  796.    SF140000,  SF150000,  SF160000,  SF110000,  // 0xB0
  797.    SF090000,  SF190000,  SF200000,  SF210000,
  798.    SF220000,  SF230000,  SF240000,  SF250000,
  799.    SF260000,  SF270000,  SF280000,  SF030000,
  800.    SF020000,  SF070000,  SF060000,  SF080000,  // 0xC0
  801.    SF100000,  SF050000,  SF360000,  SF370000,
  802.    SF380000,  SF390000,  SF400000,  SF410000,
  803.    SF420000,  SF430000,  SF440000,  SF450000,
  804.    SF460000,  SF470000,  SF480000,  SF490000,  // 0xD0
  805.    SF500000,  SF510000,  SF520000,  SF530000,
  806.    SF540000,  SF040000,  SF010000,  SF610000,
  807.    SF570000,  SF580000,  SF590000,  SF600000,
  808.    GA010000,  LS610000,  GG020000,  GP010000,  // 0xE0
  809.    GS020000,  GS010000,  SM170000,  GT010000,
  810.    GF020000,  GT620000,  GO320000,  GD010000,
  811.    SA450000,  GF010000,  GE010000,  SA380000,
  812.    SA480000,  SA020000,  SA530000,  SA520000,  // 0xF0
  813.    SS260000,  SS270000,  SA060000,  SA700000,
  814.    SM190000,  SA790000,  SD630000,  SA800000,
  815.    LN011000,  ND021000,  SM470000,  SP300000,
  816. } ;
  817.  
  818.  
  819.    // Code Page List
  820.  
  821. struct {
  822.   int CodePage ;
  823.   unsigned *Table ;
  824. } Tables [] = {
  825.   { 437, CodePage437 },
  826.   { 819, CodePage819 },
  827.   { 850, CodePage850 },
  828.   { 860, CodePage860 },
  829.   { 863, CodePage863 },
  830.   { 865, CodePage865 },
  831. } ;
  832.  
  833.  
  834.    // Main Program
  835.  
  836. extern int main ( int argc, char *argv[] ) {
  837.  
  838.    int From = 0 ;
  839.    int To = 0 ;
  840.    char Filename [_MAX_PATH] = { 0 } ;
  841.    FILE *File ;
  842.    int Byte ;
  843.    unsigned *FromTable ;
  844.    unsigned *ToTable ;
  845.    int i, j ;
  846.    unsigned char TranslationTable [256] ;
  847.    int Error ;
  848.  
  849.    while ( --argc ) {
  850.       argv ++ ;
  851.       strupr ( *argv ) ;
  852.  
  853.       if ( *argv[0] == '?' ) {
  854.          printf ( "RECODE: Convert text from codepage to codepage\n"
  855.             "\n"
  856.             "Parameters:\n"
  857.             "  FROM=Codepage  Original codepage (default 819 (ISO-8859-1)).\n"
  858.             "  TO=Codepage    New codepage (default 850).\n"
  859.         "  Filename       Name of file to convert.\n"
  860.         "\n"
  861.         "Result is sent to standard output and may be redirected."
  862.         "\n"
  863.         "Currently supported codepages:\n"
  864.         "  437 - United States PC\n"
  865.         "  819 - ISO-8859/1\n"
  866.         "  850 - Multilingual\n"
  867.         "  860 - Portuguese\n"
  868.         "  863 - French-Canadian\n"
  869.         "  865 - Nordic\n"
  870.          ) ;
  871.          return ( 0 ) ;
  872.       } /* endif */
  873.  
  874.       if ( !strncmp ( *argv, "FROM=", 5 ) ) {
  875.          if ( From ) {
  876.             fprintf ( stderr, "ERROR: Origin codepage already specified." ) ;
  877.             return ( 1 ) ;
  878.          } /* endif */
  879.          From = atoi ( *argv+5 ) ;
  880.          continue ;
  881.       } /* endif */
  882.  
  883.       if ( !strncmp ( *argv, "TO=", 3 ) ) {
  884.          if ( To ) {
  885.             fprintf ( stderr, "ERROR: Destination codepage already specified." ) ;
  886.             return ( 1 ) ;
  887.          } /* endif */
  888.          To = atoi ( *argv+3 ) ;
  889.          continue ;
  890.       } /* endif */
  891.  
  892.       if ( Filename[0] == 0 ) {
  893.          strcpy ( Filename, *argv ) ;
  894.          if ( access ( Filename, 0 ) ) {
  895.             fprintf ( stderr, "ERROR: File '%s' doesn't exist.", Filename ) ;
  896.             return ( 1 ) ;
  897.          } /* endif */
  898.          continue ;
  899.       } /* endif */
  900.  
  901.       fprintf ( stderr, "ERROR: Unrecognized option '%s'.", *argv ) ;
  902.       return ( 1 ) ;
  903.  
  904.    } /* endwhile */
  905.  
  906.    if ( From == 0 )
  907.       From = 819 ;
  908.  
  909.    if ( To == 0 )
  910.       To = 850 ;
  911.  
  912.    FromTable = 0 ;
  913.    for ( i=0; i<sizeof(Tables)/sizeof(Tables[0]); i++ ) {
  914.       if ( Tables[i].CodePage == From ) {
  915.      FromTable = Tables[i].Table ;
  916.      break ;
  917.       } /* endif */
  918.    } /* endfor */
  919.    if ( FromTable == 0 ) {
  920.       fprintf ( stderr, "ERROR: Unsupported source code page %i.", From ) ;
  921.       return ( 1 ) ;
  922.    } /* endif */
  923.  
  924.    ToTable = 0 ;
  925.    for ( i=0; i<sizeof(Tables)/sizeof(Tables[0]); i++ ) {
  926.       if ( Tables[i].CodePage == To ) {
  927.      ToTable = Tables[i].Table ;
  928.      break ;
  929.       } /* endif */
  930.    } /* endfor */
  931.    if ( ToTable == 0 ) {
  932.       fprintf ( stderr, "ERROR: Unsupported source code page %i.", To ) ;
  933.       return ( 1 ) ;
  934.    } /* endif */
  935.  
  936.    memset ( TranslationTable, 0, sizeof(TranslationTable) ) ;
  937.    for ( i=0; i<256; i++ ) {
  938.       for ( j=0; j<256; j++ ) {
  939.      if ( FromTable[i] == ToTable[j] ) {
  940.         TranslationTable[i] = (unsigned char) j ;
  941.         break ;
  942.      } /* endif */
  943.       } /* endif */
  944.    } /* endfor */
  945.  
  946.    if ( Filename[0] == 0 ) {
  947.       fprintf ( stderr, "ERROR: No filename specified." ) ;
  948.       return ( 1 ) ;
  949.    } /* endif */
  950.  
  951.    File = fopen ( Filename, "r" ) ;
  952.    if ( File == 0 ) {
  953.       fprintf ( stderr, "ERROR: Unable to open file." ) ;
  954.       return ( 1 ) ;
  955.    } /* endif */
  956.  
  957.    Error = 0 ;
  958.    while ( ( Byte = fgetc ( File ) ) >= 0 ) {
  959.       unsigned char NewByte = TranslationTable [ Byte ] ;
  960.       if ( Byte && !NewByte ) {
  961.      NewByte = ' ' ;
  962.      Error = 1 ;
  963.       } /* endif */
  964.       fputc ( NewByte, stdout ) ;
  965.    } /* endwhile */
  966.  
  967.    fclose ( File ) ;
  968.  
  969.    if ( Error )
  970.       fprintf ( stderr, "WARNING: There were untranslatable characters." ) ;
  971.  
  972.    return ( Error ) ;
  973. }
  974.