
# CSGI/ISGC を移植するときの注意

CSGI/ISGC は, フォント番号と文字コードの変換関数である. ASCII コード系
においては以下の最初のプログラムからわかるように FORTRAN77 の内部関数
CHAR/ICHAR と等価である. しかし, EBCDIC (あるいは EBCDIK)コード系では
以下第2, 第3のプログラムに見られるように内部で変換テーブルを必要とする. 
移植に際しては, 計算機のコード系を知った上で適切なものを選ぶこと.

ICHAR を用いた ISGC のプログラム例においては, ICHAR が 0 から 255 の間
の整数値を返すものとしてコーディングされている. しかしながら, システム
によっては ICHAR が -127 から 127 の間の値を返すものがある. この場合は
先頭の符合ビットを移すなどして, 0 から 255 の値を表現できるようにして
やらなければならない. たとえば

      IF (ISGC.LT.0) ISGC=ISGC+256

などを書き加えて対処すればよい. (csgi.f.other, isgc.f.other 参照)

このように ICHAR が符号なしか, 符号付きかは, ふつう configure で判定さ
れる. 符号なしの場合は, csgi.f.general, isgf.f.general が, 符号付きの場
合は, csgi.f.other, isgc.f.other が用いられる.

なお, このパッケージでは ASCII コード系に対応するものを標準としている.

*-----------------------------------------------------------------------
*     CSGI AND ISGC FOR ASCII CHARCTER CODE
*-----------------------------------------------------------------------
      CHARACTER*1 FUNCTION CSGI(IC)


      CSGI=CHAR(IC)

      END
*-----------------------------------------------------------------------
      INTEGER FUNCTION ISGC(CH)

      CHARACTER CH*1


      ISGC=ICHAR(CH)

      END
*-----------------------------------------------------------------------
*     CSGI AND ISGC FOR EBCDIC CHARCTER CODE
*-----------------------------------------------------------------------
      CHARACTER*1 FUNCTION CSGI(IC)

      INTEGER   ITBL(0:255)

*     / THE FOLLOWING TABLE IS FOR EBCDIC CHARCTER CODE /

      DATA      (ITBL(I),I=  0, 63)/
     +            0,   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,
     +           64,  79, 127, 123,  91, 108,  80, 125,
     +           77,  93,  92,  78, 107,  96,  75,  97,
     +          240, 241, 242, 243, 244, 245, 246, 247,
     +          248, 249, 122,  94,  76, 126, 110, 111/
      DATA      (ITBL(I),I= 64,127)/
     +          124, 193, 194, 195, 196, 197, 198, 199,
     +          200, 201, 209, 210, 211, 212, 213, 214,
     +          215, 216, 217, 226, 227, 228, 229, 230,
     +          231, 232, 233,  74, 224,  90,  95, 109,
     +          121, 129, 130, 131, 132, 133, 134, 135,
     +          136, 137, 145, 146, 147, 148, 149, 150,
     +          151, 152, 153, 162, 163, 164, 165, 166,
     +          167, 168, 169, 192, 106, 208, 161,  88/
      DATA      (ITBL(I),I=128,191)/
     +           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,
     +           65,  66,  67,  68,  69,  70,  71,  72,
     +           73,  81,  82,  83,  84,  85,  86,  87,
     +          138, 139, 140, 141, 142, 143, 154, 155,
     +          156, 157, 158, 159, 170, 171, 172, 173/
      DATA      (ITBL(I),I=192,255)/
     +          174, 175, 186, 187, 188, 189, 190, 191,
     +          202, 203, 204, 205, 206, 207, 218, 219,
     +          220, 221, 222, 223, 234, 235, 236, 237,
     +          238, 239,  89,  98,  99, 100, 101, 102,
     +          103, 104, 105, 112, 113, 114, 115, 116,
     +          117, 118, 119, 120, 128, 144, 160, 225,
     +          176, 177, 178, 179, 180, 181, 182, 183,
     +          184, 185, 250, 251, 252, 253, 254, 255/


      CSGI=CHAR(ITBL(IC))

      END
*-----------------------------------------------------------------------
      INTEGER FUNCTION ISGC(CH)

      CHARACTER CH*1

      INTEGER   ITBL(0:255)

*     / THE FOLLOWING TABLE IS FOR EBCDIC CHARCTER CODE /

      DATA      (ITBL(I),I=  0, 63)/
     +            0,   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,
     +          128, 129, 130, 131, 132, 133, 134, 135,
     +          136, 137, 138, 139, 140, 141, 142, 143,
     +          144, 145, 146, 147, 148, 149, 150, 151,
     +          152, 153, 154, 155, 156, 157, 158, 159/
      DATA      (ITBL(I),I= 64,127)/
     +           32, 160, 161, 162, 163, 164, 165, 166,
     +          167, 168,  91,  46,  60,  40,  43,  33,
     +           38, 169, 170, 171, 172, 173, 174, 175,
     +          127, 218,  93,  36,  42,  41,  59,  94,
     +           45,  47, 219, 220, 221, 222, 223, 224,
     +          225, 226, 124,  44,  37,  95,  62,  63,
     +          227, 228, 229, 230, 231, 232, 233, 234,
     +          235,  96,  58,  35,  64,  39,  61,  34/
      DATA      (ITBL(I),I=128,191)/
     +          236,  97,  98,  99, 100, 101, 102, 103,
     +          104, 105, 176, 177, 178, 179, 180, 181,
     +          237, 106, 107, 108, 109, 110, 111, 112,
     +          113, 114, 182, 183, 184, 185, 186, 187,
     +          238, 126, 115, 116, 117, 118, 119, 120,
     +          121, 122, 188, 189, 190, 191, 192, 193,
     +          240, 241, 242, 243, 244, 245, 246, 247,
     +          248, 249, 194, 195, 196, 197, 198, 199/
      DATA      (ITBL(I),I=192,255)/
     +          123,  65,  66,  67,  68,  69,  70,  71,
     +           72,  73, 200, 201, 202, 203, 204, 205,
     +          125,  74,  75,  76,  77,  78,  79,  80,
     +           81,  82, 206, 207, 208, 209, 210, 211,
     +           92, 239,  83,  84,  85,  86,  87,  88,
     +           89,  90, 212, 213, 214, 215, 216, 217,
     +           48,  49,  50,  51,  52,  53,  54,  55,
     +           56,  57, 250, 251, 252, 253, 254, 255/


      ISGC=ITBL(ICHAR(CH))

      END
*-----------------------------------------------------------------------
*     CSGI AND ISGC FOR EBCDIK CHARACTER CODE
*-----------------------------------------------------------------------
      CHARACTER*1 FUNCTION CSGI(IC)
 
      INTEGER   ITBL(0:255)
 
*     / THE FOLLOWING TABLE IS FOR EBCDIK CHARACTER CODE /
 
      DATA      (ITBL(I),I=  0, 63)/
     +            0,   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,
     +           64,  79, 127, 123, 224, 108,  80, 125,
     +           77,  93,  92,  78, 107,  96,  75,  97,
     +          240, 241, 242, 243, 244, 245, 246, 247,
     +          248, 249, 122,  94,  76, 126, 110, 111/
      DATA      (ITBL(I),I= 64,127)/
     +          124, 193, 194, 195, 196, 197, 198, 199,
     +          200, 201, 209, 210, 211, 212, 213, 214,
     +          215, 216, 217, 226, 227, 228, 229, 230,
     +          231, 232, 233,  74,  91,  90,  95, 109,
     +          121,  89,  98,  99, 100, 101, 102, 103,
     +          104, 105, 112, 113, 114, 115, 116, 117,
     +          118, 119, 120, 128, 139, 155, 156, 160,
     +          171, 176, 177, 192, 106, 208, 161,  88/
      DATA      (ITBL(I),I=128,191)/
     +           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,
     +           65,  66,  67,  68,  69,  70,  71,  72,
     +           73,  81,  82,  83,  84,  85,  86,  87,
     +          157, 129, 130, 131, 132, 133, 134, 135,
     +          136, 137, 138, 140, 141, 142, 172, 173/
      DATA      (ITBL(I),I=192,255)/
     +          174, 175, 186, 187, 188, 189, 190, 191,
     +          202, 203, 204, 205, 206, 207, 218, 219,
     +          220, 221, 222, 223, 234, 235, 236, 237,
     +          238, 239, 143, 144, 145, 146, 147, 148,
     +          149, 150, 151, 152, 153, 154, 162, 163,
     +          164, 165, 166, 167, 168, 169, 170, 225,
     +          158, 159, 178, 179, 180, 181, 182, 183,
     +          184, 185, 250, 251, 252, 253, 254, 255/
 
 
      CSGI=CHAR(ITBL(IC))
 
      END
*-----------------------------------------------------------------------
      INTEGER FUNCTION ISGC(CH)
 
      CHARACTER CH*1
 
      INTEGER   ITBL(0:255)
 
*     / THE FOLLOWING TABLE IS FOR EBCDIK CHARACTER CODE /
 
      DATA      (ITBL(I),I=  0, 63)/
     +            0,   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,
     +          128, 129, 130, 131, 132, 133, 134, 135,
     +          136, 137, 138, 139, 140, 141, 142, 143,
     +          144, 145, 146, 147, 148, 149, 150, 151,
     +          152, 153, 154, 155, 156, 157, 158, 159/
      DATA      (ITBL(I),I= 64,127)/
     +           32, 160, 161, 162, 163, 164, 165, 166,
     +          167, 168,  91,  46,  60,  40,  43,  33,
     +           38, 169, 170, 171, 172, 173, 174, 175,
     +          127,  97,  93,  92,  42,  41,  59,  94,
     +           45,  47,  98,  99, 100, 101, 102, 103,
     +          104, 105, 124,  44,  37,  95,  62,  63,
     +          106, 107, 108, 109, 110, 111, 112, 113,
     +          114,  96,  58,  35,  64,  39,  61,  34/
      DATA      (ITBL(I),I=128,191)/
     +          115, 177, 178, 179, 180, 181, 182, 183,
     +          184, 185, 186, 116, 187, 188, 189, 218,
     +          219, 220, 221, 222, 223, 224, 225, 226,
     +          227, 228, 229, 117, 118, 176, 240, 241,
     +          119, 126, 230, 231, 232, 233, 234, 235,
     +          236, 237, 238, 120, 190, 191, 192, 193,
     +          121, 122, 242, 243, 244, 245, 246, 247,
     +          248, 249, 194, 195, 196, 197, 198, 199/
      DATA      (ITBL(I),I=192,255)/
     +          123,  65,  66,  67,  68,  69,  70,  71,
     +           72,  73, 200, 201, 202, 203, 204, 205,
     +          125,  74,  75,  76,  77,  78,  79,  80,
     +           81,  82, 206, 207, 208, 209, 210, 211,
     +           36, 239,  83,  84,  85,  86,  87,  88,
     +           89,  90, 212, 213, 214, 215, 216, 217,
     +           48,  49,  50,  51,  52,  53,  54,  55,
     +           56,  57, 250, 251, 252, 253, 254, 255/
 
 
      ISGC=ITBL(ICHAR(CH))
 
      END
