/* [This file is written in Japanese (Shift-JIS)] */

#ifndef JS
static char *version_msg[] = {
#else
var version_msg = new Array(
#endif
"* Name:    JIYAKU.C [C] - JIYAKU.JS [JavaScript]",
"* Version: 2.52 ",
"* Date:    2021-09-08 ",
"* Author:  SADAHIRO Tomoyuki",
"*          http://nomenclator.la.coocan.jp/chem/jiyaku/jiyaku.htm ",
"*          Copyright (C) 2000-2021 SADAHIRO Tomoyuki. All rights reserved.",
"* Usage:   Translation and transliteration of an English name ",
"           of chemical elements and substances into Japanese. ",
"* 用途:    化合物の英語による化学名を日本語に字訳する。",
#ifndef JS
(char *)0
};
#else
"");
#endif

#ifndef JS
static char *usage_msg[] = {
"*  -a は、もとの英語名を日本語名と併せて（交互に）出力します。",
"    この指定が無ければ日本語名のみを出力します。",
"*  -A は、-aオプションに合わせて、レコードごとに空行を置きます。",
"*  -i は、二元型名称の倒置（carbon dioxide「二酸化炭素」など）を行います。",
"    この指定が無ければ語順を変えずに字訳（および「多少の」翻訳）をします。",
"*  -I は、-i を指定しない結果と指定した結果を並べて出力します。",
"*  -h は、ヘルプ情報を出力します。字訳はしません。",
"*  -v は、バージョン情報を出力します。字訳はしません。",
(char *)0
};
#endif


#ifndef JS
/****************************************************
                                                    *
  このファイルをCのソースとしてコンパイルするには   *
  マクロ名 JS を定義しないで行う。                  *
                                                    *
  このファイルからJavaScriptコードを抽出するには    *
  JSを定義したときのプリプロセッサの結果を用いる。  *
                                                    *
  MS VC++ 6.0 ではコマンドラインから                *
   \>CL /EP /C /DJS jiyaku.c >jiyaku.js             *
                                                    *
  LITEを定義すると簡略版になる（CでもJSでも可）。   *
  spaninvert(), invert() [二元型命名法の翻訳],      *
  ousacid() [三価リン・ヒ素酸類型名] ほか、         *
  超ウラン元素や、ある種の一般的でない名称のための  *
  処理を省略する。                                  *
                                                    *
*****************************************************/
#endif

#ifndef NC
/*
 * グローバル変数の使い方
 *
 * g()            self -> dest
 * glookahead()   self -> dest
 * glookbehind()  self -> dest
 * cvtitalic()    self -> dest, using head and tail
 * cvtjapan()     self -> dest
 * euphony()      on self; using dest, head and tail
 * ousacid()      on self; using head and tail
 * moveacid()     on self; using head and tail
 * substnum()     on self; calling g()
 * translnum()    on self; using dest, head and tail
 * translele()    on self; calling g(), translnum() etc.
 * invert()       on str something, using head
 * spaninvert()   self -> dest, using tail, calling g() etc.
 * jk()           start self
 *
 * destの内容は、self2dest()マクロでselfに戻す。
 * dest, head, tailは、いずれも一時的なバッファである。
 * 同一のバッファを同時に2以上の目的で使用してはならない。
 *
 */
#endif /* NC */

#ifndef NC
/*
 *  処理における区切りの意味づけ
 *
 *   '_'   文字区切り （以下の書式中、X はアルファベット大文字）
 *
 *   [~XX|_]  非英字（XX 常に２文字）
 *   [~^X|_]  大文字記号（X 常に１文字） # X : HI-ASCII のときにも利用。
 *   [~`X|_]  小文字記号（X 常に１文字）
 *   [~&X|_]  第二バイト ASCII -> +0x80（X: HI-ASCII）
 *   [$XXX_]  翻訳語
 *    $_      翻訳語扱いのカナ
 *   [XX_]    カナ（XX 常に２文字）
 *    /X_     カナ扱いの置き換え
 *   [%X_]    ate, ite, ideの変換までの保持（X 常に１文字）
 *   [i#e]        変換前のide陰イオンをあらわすラベル
 *   [a!e],[i!e]  変換前のate,ite陰イオンをあらわすラベル
 *   '?'   substnum() で数詞をあらわすラベル
 *   '@'   euphony(), ousacid(), moveacid() などにおける指標
 *         '@' はその処理の過程で順次適切な文字列に置換されねばならない。
 *         それぞれの処理の終了は通常 '@' の消滅を以て確認する。
 *
 *   ' '   '<'   '>'   '('   ')'   '['   ']'   '{'   '}'
 *   '*'   '\''  '\"'  '.'   ','   ':'   ';'   '-'   '='
 *         倒置のときの括弧のネストを調べるのにつかう。
 *
 *  文字列selfは、各文字が上の形式になるように順に置換される。
 */
#endif /* NC */

/* 倒置を認めるか */
#ifndef JS /* コマンドラインオプションで指定させる */
int inv = 0;
int alt = 0, alt2 = 0, inv2 = 0;
#else
var inv = true;
#endif



/* 倒置のレベル */
#ifndef JS
const int invlev = 3;
#else
var invlev = 3;
#endif

/* selfとdestの長さをチェックする。[2004-09-25] */
#ifdef DEBUGGING
int selflen, destlen;
#endif

/* 句読点のサイズ */
#ifndef JS
const int lenpct = 5;
#else
var lenpct = 5;
#endif

/* 文字列バッファのサイズ */
#ifndef JS
#define BUFSIZE (128)
#define STRSIZE (BUFSIZE * 8)
#endif

/* hydrogen */
#define HYDRSTR "/H_"
#define MUONSTR "/M_"
/* translele()   /L_ */
/* y の字訳      /Y_ */
/* aryl          /R_ */
/* e の保護      /E_ */
/* -ideの例外    /I_ */
/* anhydride     /A_ */
/* amic,anilic   /C_ */
/* bi-ate,ite    /B_ */

#ifndef JS
#define HYDR(s)  (HYDRSTR s)
#define MUON(s)  (MUONSTR s)
#else
#define HYDR(s)  (HYDRSTR + s)
#define MUON(s)  (MUONSTR + s)
#endif


/* ending consonant with silent e */
#define ECONS "dlnt"
#define VOWEL "aiueoy"
#define LOWER "abcdefghijklmnopqrstuvwxyz"
#define UPPER "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

#ifndef JS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define chrStrAt(s,n)  (s)[n]
#define memEQ(s1,s2,l) (!memcmp(s1,s2,l))
#define memNE(s1,s2,l) (memcmp(s1,s2,l))
#define strEQ(s1,s2)   (!strcmp(s1,s2))
#define strNE(s1,s2)   (strcmp(s1,s2))
#define isKANJI(c)  ((0x81 <= (0xFF & c) && (0xFF & c) <= 0x9F || \
		    0xE0 <= (0xFF & c) && (0xFF & c) <= 0xFC))
#else /* プリプロセッサによるマクロ置換に注意 */
#define strcat(i, j)  i += j
#define strcpy(i, j)  i = j
#define strEQ(i, j)   (i == j)
#define strNE(i, j)   (i != j)
#define strlen(i)     i.length
#define strchr(i, j)  i.indexOf(j)
#define strstr(i, j)  i.indexOf(j)
#define chrStrAt(s,n) s.charAt(n)
#define NULL -1
#endif

/* 共通のマクロ */
#define self2dest()    strcpy(self,dest)
#define chrmatch(i,j)  (strchr(i,j) != NULL)
#define strmatch(i,j)  (strstr(i,j) != NULL)

/*
 *  グローバル変数の文字列
 *  概要は冒頭の「グローバル変数の使い方」参照。
 */
#ifndef JS
char *self, *dest, *head, *tail;
#else
var self, dest, head, tail;
#endif

/*
 * 配列の定義
 */

/* 配列のサイズ */
#define sizeSy   46
#define sizeJp   80
#define sizeZi  105
#define sizeNoEu 11
#define sizeEn    2
#define sizeEnok  6
#define sizeYl    9
#define sizeYlok  1
#define sizeUl    4
#define sizeUlok  3
#define sizeNoAt 32
#define sizeIt   40
#define sizeId  120
#define sizeIe   22
#define sizeVa   18
#define sizeNm   12
#define sizeNoI2 11
#define sizeNoI3 70
#define sizeI4   40
#define sizeI5   25
#define sizeI6    8
#define sizeI7    8
#define sizeI8    2
#define sizeI9    2
#define sizeI10   1


/* 配列の宣言 */
#ifndef JS
char *es[sizeSy],     *sy[sizeSy];
char *noi2[sizeNoI2], *noi3[sizeNoI3];
char *i4[sizeI4], *i5[sizeI5], *i6[sizeI6];
char *i7[sizeI7], *i8[sizeI8], *i9[sizeI9], *i10[sizeI10];
char *jr[sizeJp], *jc[sizeJp];
char *zr[sizeZi], *zc[sizeZi];
char *noeu[sizeNoEu];
char *en[sizeEn], *enok[sizeEnok];
char *yl[sizeYl], *ylok[sizeYlok];
char *ul[sizeUl], *ulok[sizeUlok];
char *noat[sizeNoAt];
char *it[sizeIt];
char *id[sizeId];
char *ie[sizeIe], *ka[sizeIe];
char *va[sizeVa];
char *num[sizeNm];
#else
sy   = new Array(sizeSy);
es   = new Array(sizeSy);
noi2 = new Array(sizeNoI2);
noi3 = new Array(sizeNoI3);
i4   = new Array(sizeI4);
i5   = new Array(sizeI5);
i6   = new Array(sizeI6);
i7   = new Array(sizeI7);
i8   = new Array(sizeI8);
i9   = new Array(sizeI9);
i10  = new Array(sizeI10);
jr   = new Array(sizeJp);
jc   = new Array(sizeJp);
zr   = new Array(sizeZi);
zc   = new Array(sizeZi);
noeu = new Array(sizeNoEu);
en   = new Array(sizeEn);
enok = new Array(sizeEnok);
yl   = new Array(sizeYl);
ylok = new Array(sizeYlok);
ul   = new Array(sizeUl);
ulok = new Array(sizeUlok);
noat = new Array(sizeNoAt);
it   = new Array(sizeIt);
id   = new Array(sizeId);
ie   = new Array(sizeIe);
ka   = new Array(sizeIe);
va   = new Array(sizeVa);
num  = new Array(sizeNm);
#endif

#ifndef JS
/* 配列の初期化はＣでは関数で行う */
void initialize(void){
#endif

/*
 * 句読点の配列の初期化
 */
es[0] = "~SP|_";  sy[0] = " ";
es[1] = "~ES|_";  sy[1] = "!";
es[2] = "~OP|_";  sy[2] = "(";
es[3] = "~CL|_";  sy[3] = ")";
es[4] = "~ST|_";  sy[4] = "*";
es[5] = "~PL|_";  sy[5] = "+";
es[6] = "~CM|_";  sy[6] = ",";
es[7] = "~HY|_";  sy[7] = "-";
es[8] = "~PE|_";  sy[8] = ".";
es[9] = "~SL|_";  sy[9] = "/";
es[10]= "~ZE|_";  sy[10]= "0";
es[11]= "~ON|_";  sy[11]= "1";
es[12]= "~TW|_";  sy[12]= "2";
es[13]= "~TR|_";  sy[13]= "3";
es[14]= "~FO|_";  sy[14]= "4";
es[15]= "~FV|_";  sy[15]= "5";
es[16]= "~SX|_";  sy[16]= "6";
es[17]= "~SV|_";  sy[17]= "7";
es[18]= "~EI|_";  sy[18]= "8";
es[19]= "~NN|_";  sy[19]= "9";
es[20]= "~CN|_";  sy[20]= ":";
es[21]= "~SC|_";  sy[21]= ";";
es[22]= "~LT|_";  sy[22]= "<";
es[23]= "~EQ|_";  sy[23]= "=";
es[24]= "~GT|_";  sy[24]= ">";
es[25]= "~QU|_";  sy[25]= "?";
es[26]= "~AT|_";  sy[26]= "@";
es[27]= "~LS|_";  sy[27]= "[";
es[28]= "~RS|_";  sy[28]= "]";
es[29]= "~LB|_";  sy[29]= "{";
es[30]= "~RB|_";  sy[30]= "}";
es[31]= "~SQ|_";  sy[31]= "'";
es[32]= "~DQ|_";  sy[32]= "\"";
es[33]= "~CR|_";  sy[33]= "\r";
es[34]= "~LF|_";  sy[34]= "\n";
es[35]= "~TB|_";  sy[35]= "\t";
es[36]= "~SH|_";  sy[36]= "#";
es[37]= "~DL|_";  sy[37]= "$";
es[38]= "~PC|_";  sy[38]= "%";
es[39]= "~AM|_";  sy[39]= "&";
es[40]= "~HT|_";  sy[40]= "^";
es[41]= "~BQ|_";  sy[41]= "`";
es[42]= "~YE|_";  sy[42]= "\\";
es[43]= "~LL|_";  sy[43]= "_";
es[44]= "~TD|_";  sy[44]= "~"; /*JS では削除される文字*/
es[45]= "~VB|_";  sy[45]= "|"; /*JS では削除される文字*/

/* 他の値
~BG|_ [始端]
~FN|_ [終端]
~QT|_ [移動中止]
~FR|_ [縮合環]
~AC|_ [酸]
~AS|_ [大文字の後のase]
~NL|_ [ゼロ幅]
~BS|_ [直前の空白を削除]
~BB|_ [BS経由でスペースの代用]
~SS|_ [空白の代用]
~PS|_ [直後の空白を削除]
~UP|_ [大文字]
~LO|_ [小文字]
~GL|_ [ガリウム酸/没食子酸]
~AH|_ [酸性水素/ミュオニウム]
~DA|_ [第一塩、第二塩]
~HN|_ [水素の例外処理]
~AR|_ [アリール]
~YL|_ [イリデンなど]
~SN|_ [スズ]
~KK|_ [漢字]
*/

/* 二文字の英字列で、イタリックにしないもの（大小区別なし）*/
noi2[0] = "al";
noi2[1] = "ol";
noi2[2] = "yl";
noi2[3] = "en";
noi2[4] = "yn";
noi2[5] = "bi";
noi2[6] = "di";
noi2[7] = "de";
noi2[8] = "id";
noi2[9] = "io";
noi2[10]= "ic";

/*
 * 三文字の英字列で、イタリックにしないもの（大小区別なし）
 * OCT-8, NON-azoxy, -OSe- は別途対処する。
 */
noi3[0] = "alk";
noi3[1] = "eth";
noi3[2] = "but";
noi3[3] = "hex";
noi3[4] = "oct";
noi3[5] = "non";
noi3[6] = "dec";
noi3[7] = "tri";
noi3[8] = "bis";
noi3[9] = "kis";
noi3[10]= "ane";
noi3[11]= "ene";
noi3[12]= "ine";
noi3[13]= "one";
noi3[14]= "yne";
noi3[15]= "ano";
noi3[16]= "eno";
noi3[17]= "ino";
noi3[18]= "ono";
noi3[19]= "yno";
noi3[20]= "aza";
noi3[21]= "azi";
noi3[22]= "azo";
noi3[23]= "azy";
noi3[24]= "oxa";
noi3[25]= "oxo";
noi3[26]= "oxy";
noi3[27]= "oic";
noi3[28]= "oyl";
noi3[29]= "ium";
noi3[30]= "hen";
noi3[31]= "apo";
noi3[32]= "des";
noi3[33]= "iso";
noi3[34]= "neo";
noi3[35]= "nor";
noi3[36]= "ion";
noi3[37]= "mer";
noi3[38]= "ter";
noi3[39]= "tin";
noi3[40]= "ate";
noi3[41]= "ete";
noi3[42]= "ite";
noi3[43]= "ide";
noi3[44]= "ole";
noi3[45]= "ato";
noi3[46]= "eto";
noi3[47]= "ito";
noi3[48]= "olo";
noi3[49]= "ulo";
noi3[50]= "ylo";
noi3[51]= "uid";
noi3[52]= "gel";
noi3[53]= "gas";
noi3[54]= "ase";
noi3[55]= "ose";
noi3[56]= "cub";
noi3[57]= "buf";
noi3[58]= "car";
noi3[59]= "cev";
noi3[60]= "con";
noi3[61]= "gon";
noi3[62]= "hop";
noi3[63]= "lup";
noi3[64]= "pin";
noi3[65]= "ros";
noi3[66]= "tax";
noi3[67]= "urs";
noi3[68]= "tar";
noi3[69]= "sol";

/*
 * イタリックの配列の初期化
 */
i4[0] = "beta";
i4[1] = "zeta";
i4[2] = "iota";
i4[3] = "endo";
i4[4] = "anti";
i4[5] = "tert";
i4[6] = "peri";
i4[7] = "pros";
i4[8] = "tele";
i4[9] = "meso";
i4[10]= "ambo";
i4[11]= "keto";
i4[12]= "ribo";
i4[13]= "xylo";
i4[14]= "lyxo";
i4[15]= "allo";
i4[16]= "gulo";
i4[17]= "muco";
i4[18]= "talo";
i4[19]= "nido";
i4[20]= "asym";
i4[21]= "stat";
i4[22]= "prim";
i4[23]= "VIII";
i4[24]= "TBPY";
i4[25]= "PBPY";
i4[26]= "SAPR";
i4[27]= "HBPY";
i4[28]= "NADH";
i4[29]= "NADP";
i4[30]= "tRNA";
i4[31]= "mRNA";
i4[32]= "rRNA";
i4[33]= "UDPG";
i4[34]= "dATP";
i4[35]= "dUTP";
i4[36]= "SeSe";
i4[37]= "SeTe";
i4[38]= "TeSe";
i4[39]= "TeTe";

i5[0] = "alpha";
i5[1] = "gamma";
i5[2] = "delta";
i5[3] = "theta";
i5[4] = "kappa";
i5[5] = "sigma";
i5[6] = "omega";
i5[7] = "trans";
i5[8] = "threo";
i5[9] = "altro";
i5[10]= "gluco";
i5[11]= "manno";
i5[12]= "chiro";
i5[13]= "retro";
i5[14]= "cyclo";
i5[15]= "hapto";
i5[16]= "block";
i5[17]= "graft";
i5[18]= "quasi";
i5[19]= "amphi";
i5[20]= "unsym";
i5[21]= "NADPH";
i5[22]= "closo";
i5[23]= "hypho";
i5[24]= "klado";

i6[0] = "lambda";
i6[1] = "scyllo";
i6[2] = "active";
i6[3] = "cisoid";
i6[4] = "quadro";
i6[5] = "abcdeg"; /*corrinoids*/
i6[6] = "catena";
i6[7] = "rotaxa";

i7[0] = "epsilon";
i7[1] = "omicron";
i7[2] = "upsilon";
i7[3] = "glycero";
i7[4] = "erythro";
i7[5] = "arabino";
i7[6] = "galacto";
i7[7] = "arachno";

i8[0] = "aldehydo";
i8[1] = "transoid";

i9[0] = "triangulo";
i9[1] = "octahedro";

i10[0]= "tetrahedro";

/*
 * 日本文字の配列の初期化
 */
jc[ 0]= "ア";  jr[ 0]= "QA_";
jc[ 1]= "イ";  jr[ 1]= "QI_";
jc[ 2]= "ウ";  jr[ 2]= "QU_";
jc[ 3]= "エ";  jr[ 3]= "QE_";
jc[ 4]= "オ";  jr[ 4]= "QO_";
jc[ 5]= "カ";  jr[ 5]= "KA_";
jc[ 6]= "キ";  jr[ 6]= "KI_";
jc[ 7]= "ク";  jr[ 7]= "KU_";
jc[ 8]= "ケ";  jr[ 8]= "KE_";
jc[ 9]= "コ";  jr[ 9]= "KO_";
jc[10]= "ガ";  jr[10]= "GA_";
jc[11]= "ギ";  jr[11]= "GI_";
jc[12]= "グ";  jr[12]= "GU_";
jc[13]= "ゲ";  jr[13]= "GE_";
jc[14]= "ゴ";  jr[14]= "GO_";
jc[15]= "サ";  jr[15]= "SA_";
jc[16]= "シ";  jr[16]= "SI_";
jc[17]= "ス";  jr[17]= "SU_";
jc[18]= "セ";  jr[18]= "SE_";
#ifdef WITH_BACK_SLASH
jc[19]= "ソ\"; jr[19]= "SO_";
#else
jc[19]= "ソ";  jr[19]= "SO_";
#endif
jc[20]= "ザ";  jr[20]= "ZA_";
jc[21]= "ジ";  jr[21]= "ZI_";
jc[22]= "ズ";  jr[22]= "ZU_";
jc[23]= "ゼ";  jr[23]= "ZE_";
jc[24]= "ゾ";  jr[24]= "ZO_";
jc[25]= "タ";  jr[25]= "TA_";
jc[26]= "チ";  jr[26]= "TI_";
jc[27]= "ツ";  jr[27]= "TU_";
jc[28]= "テ";  jr[28]= "TE_";
jc[29]= "ト";  jr[29]= "TO_";
jc[30]= "ダ";  jr[30]= "DA_";
jc[31]= "ヂ";  jr[31]= "DI_";
jc[32]= "ヅ";  jr[32]= "DU_";
jc[33]= "デ";  jr[33]= "DE_";
jc[34]= "ド";  jr[34]= "DO_";
jc[35]= "ナ";  jr[35]= "NA_";
jc[36]= "ニ";  jr[36]= "NI_";
jc[37]= "ヌ";  jr[37]= "NU_";
jc[38]= "ネ";  jr[38]= "NE_";
jc[39]= "ノ";  jr[39]= "NO_";
jc[40]= "ハ";  jr[40]= "HA_";
jc[41]= "ヒ";  jr[41]= "HI_";
jc[42]= "フ";  jr[42]= "HU_";
jc[43]= "ヘ";  jr[43]= "HE_";
jc[44]= "ホ";  jr[44]= "HO_";
jc[45]= "バ";  jr[45]= "BA_";
jc[46]= "ビ";  jr[46]= "BI_";
jc[47]= "ブ";  jr[47]= "BU_";
jc[48]= "ベ";  jr[48]= "BE_";
jc[49]= "ボ";  jr[49]= "BO_";
jc[50]= "パ";  jr[50]= "PA_";
jc[51]= "ピ";  jr[51]= "PI_";
jc[52]= "プ";  jr[52]= "PU_";
jc[53]= "ペ";  jr[53]= "PE_";
jc[54]= "ポ";  jr[54]= "PO_";
jc[55]= "マ";  jr[55]= "MA_";
jc[56]= "ミ";  jr[56]= "MI_";
jc[57]= "ム";  jr[57]= "MU_";
jc[58]= "メ";  jr[58]= "ME_";
jc[59]= "モ";  jr[59]= "MO_";
jc[60]= "ヤ";  jr[60]= "YA_";
jc[61]= "ユ";  jr[61]= "YU_";
jc[62]= "ヨ";  jr[62]= "YO_";
jc[63]= "ラ";  jr[63]= "RA_";
jc[64]= "リ";  jr[64]= "RI_";
jc[65]= "ル";  jr[65]= "RU_";
jc[66]= "レ";  jr[66]= "RE_";
jc[67]= "ロ";  jr[67]= "RO_";
jc[68]= "ワ";  jr[68]= "WA_";
jc[69]= "ン";  jr[69]= "NN_";
jc[70]= "ァ";  jr[70]= "LA_";
jc[71]= "ィ";  jr[71]= "LI_";
jc[72]= "ゥ";  jr[72]= "LU_";
jc[73]= "ェ";  jr[73]= "LE_";
jc[74]= "ォ";  jr[74]= "LO_";
jc[75]= "ャ";  jr[75]= "XA_";
jc[76]= "ュ";  jr[76]= "XU_";
jc[77]= "ョ";  jr[77]= "XO_";
jc[78]= "ッ";  jr[78]= "TT_";
jc[79]= "ー";  jr[79]= "HH_";


zc[ 0] ="一";	zr[ 0] = "$1_";
zc[ 1] ="二";	zr[ 1] = "$2_";
zc[ 2] ="三";	zr[ 2] = "$3_";
zc[ 3] ="四";	zr[ 3] = "$4_";
zc[ 4] ="五";	zr[ 4] = "$5_";
zc[ 5] ="六";	zr[ 5] = "$6_";
zc[ 6] ="七";	zr[ 6] = "$7_";
zc[ 7] ="八";	zr[ 7] = "$8_";
zc[ 8] ="九";	zr[ 8] = "$9_";
#ifdef WITH_BACK_SLASH
zc[ 9] ="十\";	zr[ 9] = "$10_";
#else
zc[ 9] ="十";	zr[ 9] = "$10_";
#endif
zc[10] ="酸";	zr[10] = "$SAN_";
zc[11] ="化";	zr[11] = "$KA_";
zc[12] ="物";	zr[12] = "$BUTU_";
zc[13] ="塩";	zr[13] = "$EN_";
zc[14] ="次";	zr[14] = "$HYP_";
zc[15] ="亜";	zr[15] = "$A_";
zc[16] ="過";	zr[16] = "$PER_";
zc[17] ="水";	zr[17] = "$SUI_";
zc[18] ="酢";	zr[18] = "$SAKU_";
zc[19] ="酪";	zr[19] = "$RAKU_";
zc[20] ="吉草";   zr[20] = "$VL_";
zc[21] ="安息香"; zr[21] = "$BZ_";
zc[22] ="没食子"; zr[22] = "$MOT_";
zc[23] ="酒";	zr[23] = "$SAKE_";
zc[24] ="石";	zr[24] = "$SEKI_";
zc[25] ="乳";	zr[25] = "$NYU_";
zc[26] ="葉";	zr[26] = "$YOU_";
zc[27] ="硫";	zr[27] = "$RYU_";
zc[28] ="硝";	zr[28] = "$SYO_";
zc[29] ="炭";	zr[29] = "$TAN_";
zc[30] ="金";	zr[30] = "$KIN_";
zc[31] ="銀";	zr[31] = "$GIN_";
zc[32] ="銅";	zr[32] = "$DOU_";
zc[33] ="鉄";	zr[33] = "$TETU_";
zc[34] ="白";	zr[34] = "$SIRO_";
zc[35] ="窒";	zr[35] = "$TITU_";
zc[36] ="素";	zr[36] = "$SO_";
zc[37] ="鉛";	zr[37] = "$NAM_";
zc[38] ="黄";	zr[38] = "$OU_";
zc[39] ="臭";	zr[39] = "$SYU_";
zc[40] ="馬";	zr[40] = "$UMA_";
zc[41] ="尿";	zr[41] = "$NYO_";
zc[42] ="和";	zr[42] = "$WA_";
zc[43] ="黒";	zr[43] = "$KURO_";
zc[44] ="超";	zr[44] = "$TYO_";
zc[45] ="重";	zr[45] = "$OMO_";
zc[46] ="多";	zr[46] = "$OOI_";
zc[47] ="第";	zr[47] = "$DAI_";
zc[48] ="無";	zr[48] = "$MU_";
zc[49] ="基";	zr[49] = "$KI_";
zc[50] ="皮";	zr[50] = "$HI_";
zc[51] ="環";	zr[51] = "$KAN_";
zc[52] ="状";	zr[52] = "$JOU_";
zc[53] ="角";	zr[53] = "$KADO_";
zc[54] ="核";	zr[54] = "$KAKU_";
zc[55] ="雷";	zr[55] = "$RAI_";
zc[56] ="糖";	zr[56] = "$TOU_";
zc[57] ="菊";	zr[57] = "$KIKU_";
zc[58] ="単";	zr[58] = "$MONO_";
zc[59] ="半";	zr[59] = "$HAN_";
zc[60] ="合";	zr[60] = "$GOU_";
zc[61] ="質";	zr[61] = "$SITSU_";
zc[62] ="酵";	zr[62] = "$KOU_";
zc[63] ="属";	zr[63] = "$ZOKU_";
zc[64] ="脂";	zr[64] = "$SHI_";
zc[65] ="肪";	zr[65] = "$BOU_";
zc[66] ="色";	zr[66] = "$IRO_";
zc[67] ="性";	zr[67] = "$SEI_";
zc[68] ="双";	zr[68] = "$SOU_";
zc[69] ="両";	zr[69] = "$RYO_";
zc[70] ="補";	zr[70] = "$HO_";
zc[71] ="脱";	zr[71] = "$DAT_";
zc[72] ="不足";	zr[72] = "$HUSOK_";
zc[73] ="過剰";	zr[73] = "$KAJO_";
zc[74] ="共役";	zr[74] = "$CONJ_";
zc[75] ="粘液";	zr[75] = "$NENEK_";
zc[76] ="還元";	zr[76] = "$RED_";
zc[77] ="転";	zr[77] = "$TEN_";
zc[78] ="写";	zr[78] = "$SYA_";
zc[79] ="移";	zr[79] = "$II_";
zc[80] ="細胞";	zr[80] = "$CYT_";
zc[81] ="内";	zr[81] = "$NAI_";
zc[82] ="外";	zr[82] = "$GAI_";
zc[83] ="加";	zr[83] = "$ADD_";
zc[84] ="分解";	zr[84] = "$DEC_";
zc[85] ="活";	zr[85] = "$KAT_";
zc[86] ="分子";	zr[86] = "$MOL_";
zc[87] ="種";	zr[87] = "$SHU_";
zc[88] ="級";	zr[88] = "$KYU_";
zc[89] ="原子";	zr[89] = "$ATOM_";
zc[90] ="芳香";	zr[90] = "$AR_";
zc[91] ="族";	zr[91] = "$ZK_";
zc[92] ="複製";	zr[92] = "$DUPL_";
zc[93] ="式";	zr[93] = "$SIKI_";
zc[94] ="体";	zr[94] = "$BODY_";
zc[95] ="供与";	zr[95] = "$DON_";
zc[96] ="受容";	zr[96] = "$ACC_";
zc[97] ="因子";	zr[97] = "$FAC_";
zc[98] ="残";	zr[98] = "$ZAN_";
zc[99] ="有";	zr[99] = "$YUU_";
zc[100]="機";	zr[100]= "$KIY_";
zc[101]="非";	zr[101]= "$NON_";
zc[102]="反";	zr[102]= "$ANTI_";
zc[103]="樹";	zr[103]= "$TREE_";
zc[104]="胆汁";	zr[104]= "$BILE_";

/*
 *  ide陰イオン
 */
id[0] = "hydr";
id[1] = "deuter";
id[2] = "trit";
id[3] = "bor";
id[4] = "carb";
id[5] = "acetyl";
id[6] = "nitr";
id[7] = "cyan";
id[8] = "az";
id[9] = "ox";
id[10]= "ozon";
id[11]= "fluor";
id[12]= "silic";
id[13]= "phosph";
id[14]= "sulf";
id[15]= "chlor";
id[16]= "arsen";
id[17]= "selen";
id[18]= "brom";
id[19]= "antimon";
id[20]= "tellur";
id[21]= "iod";
id[22]= "halogen";
id[23]= "hal";
id[24]= "chalcogen";
id[25]= "stann";
id[26]= "plumb";
id[27]= "astat";
id[28]= "prot";
id[29]= "muon";
id[30]= "germ";
id[31]= "bismuth";
id[32]= "polon";
id[33]= "alumin";
id[34]= "gall";
id[35]= "ind";
id[36]= "thall";
id[37]= "zinc";
id[38]= "cadm";
id[39]= "mercur";
id[40]= "cupr";
id[41]= "argent";
id[42]= "aur";
id[43]= "nickel";
id[44]= "pallad";
id[45]= "platin";
id[46]= "cobalt";
id[47]= "rhod";
id[48]= "irid";
id[49]= "ferr";
id[50]= "ruthen";
id[51]= "osm";
id[52]= "mangan";
id[53]= "technet";
id[54]= "rhen";
id[55]= "chrom";
id[56]= "molybden";
id[57]= "tungst";
id[58]= "vanad";
id[59]= "niob";
id[60]= "tantal";
id[61]= "titan";
id[62]= "zircon";
id[63]= "hafn";
id[64]= "scand";
id[65]= "yttr";
id[66]= "lanthan";
id[67]= "cer";
id[68]= "praseodym";
id[69]= "neodym";
id[70]= "prometh";
id[71]= "samar";
id[72]= "europ";
id[73]= "gadolin";
/*terb -> erb */
id[74]= "dyspros";
id[75]= "holm";
id[76]= "erb";
id[77]= "thul";
/*ytterb -> erb */
id[78]= "lutet";
id[79]= "actin";
id[80]= "thor";
/*protactin -> actin */
id[81]= "uran";
id[82]= "neptun";
id[83]= "pluton";
id[84]= "americ";
id[85]= "cur";
id[86]= "berkel";
id[87]= "californ";
id[88]= "einstein";
id[89]= "ferm";
id[90]= "mendelev";
id[91]= "nobel";
id[92]= "lawrenc";
id[93]= "beryll";
id[94]= "magnes";
id[95]= "calc";
id[96]= "stront";
id[97]= "bar";
id[98]= "rad";
id[99]= "lith";
id[100]="natr";
id[101]="kal";
id[102]="rubid";
id[103]="ces"; /* also "caes" */
id[104]="franc";
id[105]="hel";
id[106]="neon";
id[107]="argon";
id[108]="krypton";
id[109]="xenon";
id[110]="radon";
id[111]="sod";    /*XXX*/
id[112]="potass"; /*XXX*/
id[113]="rutherford";
id[114]="dubn";
id[115]="seaborg";
id[116]="bohr";
id[117]="hass";
id[118]="meitner";
id[119]="pnict";

/*
 *  ide の翻訳
 */
ie[0] = "hydr%D_";    ka[0] = "$SUI_$SO_$KA_";
ie[1] = "bor%D_";     ka[1] = "$_HO_QU_$KA_";
ie[2] = "carb%D_";    ka[2] = "$TAN_$KA_";
ie[3] = "nitr%D_";    ka[3] = "$TITU_$KA_";
ie[4] = "cyan%D_";    ka[4] = "cyan$KA_";
ie[5] = "az%D_";      ka[5] = "QA_ZI_$KA_";
ie[6] = "hydrox%D_";  ka[6] = "$SUI_$SAN_$KA_";
ie[7] = "ox%D_";      ka[7] = "$SAN_$KA_";
ie[8] = "ozon%D_";    ka[8] = "QO_ZO_NN_$KA_";
ie[9] = "fluor%D_";   ka[9] = "$_HU_TT_$KA_";
ie[10]= "silic%D_";   ka[10]= "$_KE_QI_$KA_";
ie[11]= "phosph%D_";  ka[11]= "$_RI_NN_$KA_";
ie[12]= "sulf%D_";    ka[12]= "$RYU_$KA_";
ie[13]= "chlor%D_";   ka[13]= "$EN_$KA_";
ie[14]= "arsen%D_";   ka[14]= "$_HI_$KA_";
ie[15]= "brom%D_";    ka[15]= "$SYU_$KA_";
ie[16]= "antimon%D_"; ka[16]= "$_QA_NN_TI_MO_NN_$KA_";
ie[17]= "iod%D_";     ka[17]= "$_YO_QU_$KA_";
ie[18]= "hal%D_";     ka[18]= "$_HA_RO_GE_NN_$KA_";
ie[19]= "astat%D_";   ka[19]= "$_QA_SU_TA_TI_NN_$KA_";
ie[20]= "germ%D_";    ka[20]= "$_GE_RU_MA_NI_QU_MU_$KA_";
ie[21]= "acetyl%D_";  ka[21]= "$_QA_SE_TI_RE_NN_$KA_";

/*
 *  ite陰イオン
 */
it[0] = "fluor";
it[1] = "chlor";
it[2] = "brom";
it[3] = "iod";
it[4] = "hal";
it[5] = "halogen";
it[6] = "sulf";
it[7] = "selen";
it[8] = "tellur";
it[9] = "thion";
it[10]= "nitr";
it[11]= "phosph";
it[12]= "phosphon";
it[13]= "phosphin";
it[14]= "phosphen";
it[15]= "arsen";
it[16]= "arson";
it[17]= "arsin";
it[18]= "arsenen";
it[19]= "antimon";
it[20]= "stibon";
it[21]= "stibin";
it[22]= "peroxo";
it[23]= "thio";
it[24]= "seleno";
it[25]= "telluro";
it[26]= "fluorid";
it[27]= "chlorid";
it[28]= "bromid";
it[29]= "iodid";
it[30]= "hydrazid";
it[31]= "amid";
it[32]= "imid";
it[33]= "azid";
it[34]= "nitrid";
it[35]= "cyanid";
it[36]= "cyanatid";
it[37]= "hydrazon";
it[38]= "stann";
it[39]= "plumb";

/* 酸でない'-ate' */
/* spaninvert()中str0,str1の制約から、27(=32-4-1)文字以内とせよ */
noat[0] = "ol";
noat[1] = "hydr";
noat[2] = "ammoni";
noat[3] = "conjug";
noat[4] = "alanin";
noat[5] = "arginin";
noat[6] = "asparagin";
noat[7] = "cystein";
noat[8] = "glutamin";
noat[9] = "glycin";
noat[10]= "histidin";
noat[11]= "leucin";
noat[12]= "lysin";
noat[13]= "ethionin"; /* methio-, ethio- */
noat[14]= "prolin";
noat[15]= "serin";
noat[16]= "threonin";
noat[17]= "tryptophan";
noat[18]= "tyrosin";
noat[19]= "valin";
noat[20]= "citrullin";
noat[21]= "cystin";
noat[22]= "ornithin";
noat[23]= "sarcosin";
noat[24]= "thyronin";
noat[25]= "thyroxin";
noat[26]= "porphyrin";
noat[27]= "phthalocyanin";
noat[28]= "diazo";
noat[29]= "diazot";
noat[30]= "chel";
noat[31]= "ly";

/* euphonyを禁ずる場合 */

noeu[0] = "a@";
noeu[1] = "i@";
noeu[2] = "e@";
noeu[3] = "o@";
noeu[4] = "y@";
noeu[5] = "u@";
noeu[6] = "yl@";
noeu[7] = "bis@";
noeu[8] = "tris@";
noeu[9] = "kis@";
noeu[10]= "ium@";

en[0] = "an@"; /* spiro[ane]-, cyclophan- */
en[1] = "en@"; /* en-yn */

yl[0] = "an@";
yl[1] = "en@";
yl[2] = "yn@";
yl[3] = "in@";
yl[4] = "on@";
yl[5] = "et@";
yl[6] = "id@";
yl[7] = "os@";
yl[8] = "ol@";

ul[0] = "os@"; /* os-ulose */
ul[1] = "ol@";
ul[2] = "en@";
ul[3] = "yn@";

/* noeu[] etc.に反してやはりeuphonyを認める */
enok[0] = "olean@"; /* olean-ene */
enok[1] = "formosan@"; /* formosan-ene */
enok[2] = "hasuban@"; /* hasuban-ene */
enok[3] = "guai@"; /* guai-ene */
enok[4] = "lycoren@"; /* lycoren-ene */
enok[5] = "roten@"; /* roten-ene */

ylok[0] = "non@"; /* non-3-yl */

ulok[0] = "icos@"; /* icos-ulose */
ulok[1] = "docos@"; /* docos-ulose */
ulok[2] = "acos@"; /* tetracos-ulose */

va[0] = "~OP|_~ZE|_~CL|_";
va[1] = "~OP|_~^I|_~CL|_";
va[2] = "~OP|_~^I|_~^I|_~CL|_";
va[3] = "~OP|_~^I|_~^I|_~^I|_~CL|_";
va[4] = "~OP|_~^I|_~^V|_~CL|_";
va[5] = "~OP|_~^V|_~CL|_";
va[6] = "~OP|_~^V|_~^I|_~CL|_";
va[7] = "~OP|_~^V|_~^I|_~^I|_~CL|_";
va[8] = "~OP|_~^V|_~^I|_~^I|_~^I|_~CL|_";
va[9] = "~OP|_~HY|_~^I|_~CL|_";
va[10]= "~OP|_~HY|_~^I|_~^I|_~CL|_";
va[11]= "~OP|_~HY|_~^I|_~^I|_~^I|_~CL|_";
va[12]= "~OP|_~HY|_~^I|_~^V|_~CL|_";
va[13]= "~OP|_~HY|_~^V|_~CL|_";
va[14]= "~OP|_~HY|_~^V|_~^I|_~CL|_";
va[15]= "~OP|_~HY|_~^V|_~^I|_~^I|_~CL|_";
va[16]= "~OP|_~HY|_~^V|_~^I|_~^I|_~^I|_~CL|_";
va[17]= "~OP|_~^I|_~^I|_~^I|_~CM|_~^V|_~CL|_";

num[0] = "";
num[1] = "hen";
num[2] = "do";
num[3] = "tri";
num[4] = "tetra";
num[5] = "penta";
num[6] = "hexa";
num[7] = "hepta";
num[8] = "octa";
num[9] = "nona";
num[10]= "deca";
num[11]= "undeca";

/* 以上、配列の定義 */
#ifndef JS
} /* JSでは関数にしないので閉じ不要 */
#endif

#ifndef NC
/******************************************************************
 *
 *  置換関数 [as like s/$bef/$aft/g of Perl]
 *  befがaftの部分文字列を含んでも無限ループにならないよう改善。
 *
 ******************************************************************/
#endif /* NC */

#ifndef JS
void g(char * bef, char * aft)
{
    char *p, *a, *d, *s;
    size_t blen;

    p = strstr(self, bef);
    if (!p)
	return;
    s = self; d = dest;
    blen = strlen(bef);
    while (p) {
	while (s < p)
	    *d++ = *s++;
	for (a = aft; *a;)
	    *d++ = *a++;
	s += blen;
	p = strstr(s, bef);
    }
    while (*s)
	*d++ = *s++;
    *d = '\0';
#ifdef DEBUGGING
    if (d - dest > destlen)
	destlen = d - dest + 1;
    if (destlen > selflen)
	selflen = destlen;
#endif
    self2dest();
}
#else
function g(bef,aft)
{
    if (self.indexOf(bef) == -1) { return; }
    var pos = 0;
    dest = "";
    while ((pos = self.indexOf(bef)) != -1) {
	dest += self.substring(0,pos) + aft;
	self = self.substring(pos + bef.length, self.length);
    }
    dest += self;
    self = dest;
}
#endif


#ifndef NC
/******************************************************************
 *
 *  置換関数（先読み） [as like s/$bef(?=[$list])/$aft/g of Perl]
 *
 ******************************************************************/
#endif /* NC */

#ifndef JS

void glookahead(char* bef, char* list, char* aft)
{
    char *p, *a, *d, *s;
    size_t blen;

    p = strstr(self, bef);
    if (!p)
	return;
    s = self; d = dest;
    blen = strlen(bef);
    while (p) {
	while (s < p) {
	    *d++ = *s++;
	}
	if (strchr(list, s[blen])) {
	    s += blen;
	    for (a = aft; *a;)
		*d++ = *a++;
	} else {
	    *d++ = *s++; /* go ahead by a byte */
	}
	p = strstr(s, bef);
    }
    while (*s)
	*d++ = *s++;
    *d = '\0';
#ifdef DEBUGGING
    if (d - dest > destlen)
	destlen = d - dest + 1;
    if (destlen > selflen)
	selflen = destlen;
#endif
    self2dest();
}
#else
function glookahead(bef,list,aft)
{
    if (self.indexOf(bef) == -1) { return; }
    var pos = 0;
    var blen = bef.length;
    dest = "";
    while ((pos = self.indexOf(bef)) != -1) {
	if (list.indexOf(self.substring(pos + blen, pos + blen + 1)) != -1) {
	    dest += self.substring(0,pos) + aft;
	    self = self.substring(pos + blen, self.length);
	} else {
	    dest += self.substring(0, pos + 1);
	    self = self.substring(pos + 1, self.length);
	}
    }
    dest += self;
    self = dest;
}
#endif


#ifndef NC
/******************************************************************
 *
 *  置換関数（後読み） [as like s/(?<=[$list])$bef/$aft/g of Perl]
 *
 ******************************************************************/
#endif /* NC */

#ifndef JS

void glookbehind(char* list, char* bef, char* aft)
{
    char *p, *a, *d, *s;
    size_t blen;

    p = strstr(self, bef);
    if (!p)
	return;
    s = self; d = dest;
    blen = strlen(bef);
    while (p) {
	while (s < p) {
	    *d++ = *s++;
	}
	if (s != self && strchr(list, s[-1])) {
	    s += blen;
	    for (a = aft; *a;)
		*d++ = *a++;
	} else {
	    *d++ = *s++; /* go ahead by a byte */
	}
	p = strstr(s, bef);
    }
    while (*s)
	*d++ = *s++;
    *d = '\0';
#ifdef DEBUGGING
    if (d - dest > destlen)
	destlen = d - dest + 1;
    if (destlen > selflen)
	selflen = destlen;
#endif
    self2dest();
}
#else
function glookbehind(list,bef,aft)
{
    if (self.indexOf(bef) == -1) { return; }
    var pos = 0;
    var blen = bef.length;
    dest = "";
    while ((pos = self.indexOf(bef)) != -1) {
	if (pos > 0 && list.indexOf(self.substring(pos - 1, pos)) != -1) {
	    dest += self.substring(0,pos) + aft;
	    self = self.substring(pos + blen, self.length);
	} else {
	    dest += self.substring(0, pos + 1);
	    self = self.substring(pos + 1, self.length);
	}
    }
    dest += self;
    self = dest;
}
#endif


#ifndef NC
/********************************************************************
 *
 *  関数 cvtitalic()
 *
 *  句読点や数字にはさまれた部分がイタリックかどうか判定し、
 *  その部分を変換する。
 *  それらは "~^X|_"（大文字）か "~`X|_"（小文字）の形式をとる。
 *  それ以外の英字は小文字に変換する。
 *  なお、以後の処理では、残った小文字の部分の解釈と変換を主とする。
 *
 * 例えば、"~BG|_N~HY|_tert~HY|_butylacetamide~FN|_" なら、
 * N と tert をイタリックと判定しなければならない。
 *
 ********************************************************************/
/* 変数
    abc      a-z の文字列（定数）
    i        繰り返し変数
    isIt     フラグ no_italic=0 yes_italic=1
    pos      '_' の位置。
    pct      英字 key の直後の句読点
    lastpct  英字 key の直前の句読点
    key      先頭から切り出した英字部分（Ｃではheadに）
    lenkey   keyの長さ
    lowkey   keyを小文字に変換した英文字列（Ｃではtailに）
    ch       keyのある１文字（JS のみ）
    uc       uppkeyのある１文字（JS のみ）
 */
#endif /* NC */

#ifndef JS
void cvtitalic(void)
#else
function cvtitalic()
#endif
{

#ifndef JS
    int i, isIt, lenkey;
    char *s, *key, *lowkey;
    char *pos, *pct_ptr, pct[8], lastpct[8];
    char *abc = LOWER;
#else
    var i, isIt, pos, key, lenkey, lowkey, pct, lastpct;
    var abc = LOWER;
#endif

    g("_Base~", "_base~"); /* not B-ase */
    glookbehind(UPPER, "ase~", "~AS|_~");
    /* g() using dest */
    strcpy(dest,""); /* also JS */

#ifndef JS
    s = self;
    while ((pos = strchr(s,'_')) != NULL) {
#else
    while ((pos = self.indexOf('_')) != -1) {
#endif
	strcpy(lastpct,pct);

#ifndef JS
	key = head; pct_ptr = pct;
	while (s <= pos-lenpct)
	    *key++ = *s++;
	while (s <= pos)
	    *pct_ptr++ = *s++;
	*key = *pct_ptr = '\0';
	key = head; /* ポインタを先頭に戻す */
#else
	key  = self.substring(0, pos+1-lenpct);
	pct  = self.substring(pos+1-lenpct, pos+1);
	self = self.substring(pos+1, self.length);
#endif
	isIt = 0; /* フラグの初期化 */
	lenkey = strlen(key); /* keyの長さ */ /* also JS */

 /* keyの大小揃え */
#ifndef JS
	key = head; lowkey = tail;
	while (*key)
	    *lowkey++ = (char) tolower(*key++);
	*lowkey = '\0';
	/* ポインタを先頭に戻す */
	key = head; lowkey = tail;
#else
	lowkey = key.toLowerCase();
#endif

	/* 一文字（大小とも）の場合、イタリック */
	if (lenkey == 1) {
	    isIt = 1;
	}
	/* UPPERaseの置き換えはイタリック */
	else if (strEQ(pct,"~AS|_")) {
	    isIt = 1;
	}
	/* 二文字（大小とも）の場合、noi2[] をみる */
	else if (lenkey == 2) {
	    isIt = 1;
	    if (strEQ(key, "Bi") || strEQ(key, "de")) {
		if (strEQ(pct,"~HY|_") ||
		    strEQ(pct,"~OP|_") ||
		    strEQ(pct,"~LS|_") ||
		    strEQ(pct,"~LB|_") )
		{
		    isIt = 0;
		}
	    }
	    else if (strNE(key,"Al")) {
		for (i=0; i < sizeNoI2; i++) {
		    if (strEQ(lowkey,noi2[i])) { isIt = 0; break; }
		}
	    }
	}
	else if (lenkey == 3) {
	    isIt = 1;
	    for (i=0; i < sizeNoI3; i++) {
		if (strEQ(lowkey,noi3[i])) { isIt = 0; break; }
	    }
		/* epi[1,4]dioxino etc.*/
	    if (strEQ(key, "epi") && !strEQ(pct,"~HY|_")) {
		isIt = 0;
	    }
	    if (strEQ(key, "cob") && strEQ(pct,"~OP|_")) {
		isIt = 0;
	    }
	}

	/* 母音を含まなければイタリック */  /* NULL:-1 in JS */
	else if (strchr(lowkey,'a') == NULL &&
		 strchr(lowkey,'e') == NULL &&
		 strchr(lowkey,'i') == NULL &&
		 strchr(lowkey,'o') == NULL &&
		 strchr(lowkey,'u') == NULL &&
		 strchr(lowkey,'y') == NULL ) {
	    isIt = 1;
	}

/* abc, def など連番の縮合位置の記号（小文字）*/
	/* NULL:-1 in JS */
	else if (strmatch(abc,key)) {
	    isIt = 1;
	}

/* stuva, stuvwxabcde など非連続の縮合位置の記号（小文字）。通常、
   前半(例えばstuv)は後半(例えばab)より後だが、チェックしていない。 */
	if (isIt == 0)
#ifndef JS
	{
	    char* pos_sec = strchr(abc,key[lenkey-1]);
	    if (pos_sec) {
		size_t seclen = pos_sec - abc + 1;
		if (lenkey - seclen > 0 &&
		    key[lenkey - seclen] == 'a' &&
		    memEQ(abc, key + lenkey - seclen, seclen)) {
		    char* pos_ini = strchr(abc,key[0]);
		    if (pos_ini && memEQ(pos_ini, key, lenkey - seclen))
			isIt = 1;
		}
	    }
	}
#else
	{
	    var pos_sec = abc.indexOf(key.substring(lenkey-1,lenkey));
	    if (pos_sec != -1) {
		var seclen = pos_sec + 1;
		if (lenkey - seclen > 0 &&
		    (abc.indexOf(key.substring(lenkey - seclen,lenkey)) != -1) &&
		    (abc.indexOf(key.substring(0,lenkey - seclen)) != -1)) {
			isIt = 1;
		}
	    }
	}
#endif

/* 特定のイタリック文字列 */ /* also JS */
	if (isIt == 0) {
	    if (lenkey == 4) {
		for (i=0; i < sizeI4; i++) {
		    if (strEQ(key,i4[i])) { isIt = 1; break; }
		}
		if (strEQ(key, "keto") && strNE(pct,"~HY|_")) {
		    isIt = 0;
		}
	    }
	    else if (lenkey == 5) {
		for (i=0; i < sizeI5; i++) {
		    if (strEQ(key,i5[i])) { isIt = 1; break; }
		}
		/* "cyclo" の前がハイフンのとき (e.g. 5,7α-cyclo)
			 後がハイフンでないとき */
		if (strEQ(key, "cyclo") &&
			(strNE(pct,"~HY|_") || strEQ(lastpct,"~HY|_")) ) {
		    isIt = 0;
		}

		/* HTMLタグの混入に対処 */
		if (strEQ(lowkey, "small") && strNE(pct, "~HY|_")) {
		    isIt = 1;
		}
	    }
	    else if (lenkey == 6) {
		for (i=0; i < sizeI6; i++) {
		    if (strEQ(key,i6[i])) { isIt = 1; break; }
		}
	    }
	    else if (lenkey == 7) {
		for (i=0; i < sizeI7; i++) {
		    if (strEQ(key,i7[i])) { isIt = 1; break; }
		}
	    }
	    else if (lenkey == 8) {
		for (i=0; i < sizeI8; i++) {
		    if (strEQ(key,i8[i])) { isIt = 1; break; }
		}
	    }
	    else if (lenkey == 9) {
		for (i=0; i < sizeI9; i++) {
		    if (strEQ(key,i9[i])) { isIt = 1; break; }
		}
	    }
	    else if (lenkey == 10) {
		for (i=0; i < sizeI10; i++) {
		    if (strEQ(key,i10[i])) { isIt = 1; break; }
		}
	    }
	    /* 11文字以上はイタリックなし */
	}

/* 変換結果をdestの後ろにつなげる */ /* also JS */
	if (isIt == 0) {
	    strcat(dest, lowkey);
	    strcat(dest, pct);
	} else {
	    for (i=0; i<lenkey; i++) {
#ifndef JS
		strcat(dest, key[i] != lowkey[i] ? "~^" : "~`");
		lowkey[i] -= ' '; /* toupper */
		strcat(dest, " |_");
		dest[strlen(dest)-3] = lowkey[i];
#else
		ch = key.substring(i,i+1);
		uc = ch.toUpperCase();
		dest += (ch == uc ? "~^" : "~`") +  uc + "|_";
#endif
	    }
	    strcat(dest, pct);
	}
    } /* end_while */
    self2dest();
    g("~AS|_", "ase");
}


#ifndef NC
/********************************************************************
 *
 *  関数 cvtjapan()
 *
 *  selfを日本文字に変換する
 *
 ********************************************************************/
/*
    i    繰り返し
    pos  '_' の位置
    key  以前のposから今度のposまでの部分文字列
 */
#endif /* NC */

#ifndef JS
void cvtjapan(void)
#else
function cvtjapan()
#endif
{

#ifndef JS
    int i;  /* 繰り返し変数 */
    char *pos, *s, *k, key[16], keynext;
#else
    var i, pos, key;
#endif

    strcpy(dest,""); /* also JS */

/*
 * selfをスキャンして変換結果をdestの後ろにつなげる
 */
#ifndef JS
    s = self;
    while ((pos = strchr(s,'_')) != NULL) {
	if (pos - s > 15) {
	    strcat(dest, "ERROR [Too Long Key]");
	    s = pos + 1;
	    continue;
	}
#else
    while ((pos = self.indexOf('_')) != -1) {
#endif

	keynext = 0; /* フラグの初期化 */

/* '_' を含むところまでkeyをコピー */
#ifndef JS
	for (k = key; s <= pos;)
	    *k++ = *s++;
	*k = '\0';
#else
	key  = self.substring(0,pos+1);
	self = self.substring(pos+1, self.length);
#endif

	if (chrStrAt(key,0) == '~') {
	/* イタリックの英字。'^' を含むのが大。'`' を含むのが小。 */
#ifndef JS
	    if (key[1] == '^') {
		key[3] = '\0';
		strcat(dest, key+2);
	    }
	    else if (key[1] == '`') {
		key[2] += 0x20; /* tolower */
		key[3] = '\0';
		strcat(dest, key+2);
	    }
	    else if (key[1] == '&') { /* C のみ */
		key[2] &= 0x7F;
		key[3] = '\0';
		strcat(dest, key+2);
	    }
#else
	    if (key.indexOf('^') != -1) {
		dest += key.substring(2,3);
	    }
	    else if (key.indexOf('`') != -1) {
		dest += key.substring(2,3).toLowerCase();
	    }
#endif
	    else {
	    /* 句読点への変換 */ /* also JS */
		for (i=0; i < sizeSy; i++) {
		    if (strEQ(key,es[i])) {
			strcat(dest,sy[i]);
			break;
		    }
		}
	    }

	    /* ~ で始まるものは変換先がなくても無視する */
	    continue;
	}

	if (chrStrAt(key,0) == '$') { /* 漢字への変換 */
	    if (chrStrAt(key,1) == '_')
		continue;
	    for (i=0; i < sizeZi; i++) {
		if (strEQ(key,zr[i])) {
		    strcat(dest,zc[i]);
		    keynext++;
		    break;
		}
	    }
	}
	else { /* 仮名への変換 */
	    for (i=0; i < sizeJp; i++) {
		if (strEQ(key,jr[i])) {
		    strcat(dest,jc[i]);
		    keynext++;
		    break;
		}
	    }
	}

	if (!keynext) {
	    strcat(dest, "ERROR [");
	    strcat(dest, key);
	    strcat(dest, "]");
	}
    } /* end while */
    self2dest(); /* also JS */
}

#ifndef NC
/********************************************************************
 *
 *  euphony()
 *
 *  引数の文字列 ending について
 *  記号を挟んで直前の文字の後に vowel を補う
 *
 *  but-2-ene, bicyclohept-3-yl, hex-2-ulose など
 *
 ********************************************************************/
/* 変数
    i      繰り返し変数
    flag   フラグ（1: 'a'を付ける、0: '@'を除く）
    from   "|_"  + ending
    to     "|_@" + ending
    *p     selfにおける'@'の位置
    *pp    selfにおける'|_@'の位置
    head   先頭から切り出した部分（グローバル）
    pct    key の直後の句読点
    dest   '@' の前の文字列。head + pct + '@' に等しい（グローバル）
    tail   '@' の後の文字列を保持（グローバル）
 */
#endif /* NC */

#ifndef JS
void euphony(const char * ending, const char * vowel)
#else
function euphony(ending, vowel)
#endif
{

#ifndef JS
    int i, flag;
    char from[8];
    char to[8];
    char *p, *pp, *s, *h, *d, *t;
    char *pct_ptr, pct[8];

#else
    var i, flag, from, to, p, pp, pct;
#endif

/* 語尾の前に @ を付加する */
    strcpy(from, "|_");
    strcpy(to, "|_@");
    strcat(from, ending);
    strcat(to, ending);
    g(from,to);

/* selfをスキャンする */
    while ((p = strchr(self,'@')) != NULL) {
	flag = 1;
	pp = strstr(self,"|_@"); /* Is '@' before symbol? */

/* 先端から、headとpctを取り出す */
#ifndef JS
	s = self; d = dest; h = head;
	t = tail; pct_ptr = pct;
	while (s < p-lenpct)
	    *d++ = *h++ = *s++;
	while (s < p)
	    *d++ = *pct_ptr++ = *s++;
	*d++ = *s++; /* move '@' */
	while (*s)
	    *t++ = *s++;
	*pct_ptr = *h = *t = *d = '\0';
#else
	head = self.substring(0, p-lenpct);
	pct  = self.substring(p-lenpct, p);
	dest = self.substring(0, p+1); /* '@' 含む */
	tail = self.substring(p+1, self.length); /* '@'含まない */
#endif

	if (strEQ(pct,"~BG|_")) { /* 前が始端なら '@' は削除 */
	    strcpy(self,head);
	    strcat(self,pct);
	    strcat(self,tail);
	}
	else if (p == pp + 2) { /* 前が記号なら '@' を前に移動 */
	    strcpy(self,head);
	    strcat(self,"@");
	    strcat(self,pct);
	    strcat(self,tail);
	}
	else {
	    for (i=0; i< sizeNoEu; i++) {
		if (strmatch(dest,noeu[i])) {
		    flag=0; break;
		}
	    }

	    if (strEQ(ending,"en") || strEQ(ending,"yn")) {
		for (i=0; i< sizeEn; i++) {
		    if (strmatch(dest,en[i])) {
			flag=0; break;
		    }
		}
		for (i=0; i< sizeEnok; i++) {
		    if (strmatch(dest,enok[i])) {
			flag=1; break;
		    }
		}
	    }
	    else if (strEQ(ending,"ulo")) {
		for (i=0; i< sizeUl; i++) {
		    if (strmatch(dest,ul[i])) {
			flag=0; break;
		    }
		}
		for (i=0; i< sizeUlok; i++) {
		    if (strmatch(dest,ulok[i])) {
			flag=1; break;
		    }
		}
	    }
	    else if (strEQ(ending,"yl")) {
		for (i=0; i<sizeYl; i++) {
		    if (strmatch(dest,yl[i])) {
			flag=0; break;
		    }
		}
		for (i=0; i< sizeYlok; i++) {
		    if (strmatch(dest,ylok[i])) {
			flag=1; break;
		    }
		}
		if (strmatch(dest,"quinon@"))
		    flag=0;
	    }
	    else {
		flag = 0;
	    }

	    if (flag) {
		strcpy(self,head);
		strcat(self,pct);
		strcat(self,vowel);
		strcat(self,tail);
	    } else {
		strcpy(self,head);
		strcat(self,pct);
		strcat(self,tail);
	    }
	}
    } /* end while */
}


#ifndef LITE
#ifndef NC
/********************************************************************
 **
 **  ousacid()
 **
 **  「亜」「酸」の位置の調整を行う
 **
 ********************************************************************/
/* 変数
    head   pctの前の部分（グローバル）
    pct    '@' の直前の句読点
    tail   '@'の後の文字列を保持（グローバル）
*/
#endif /* NC */

#ifndef JS
void ousacid(void)
#else
function ousacid()
#endif
{

#ifndef JS
    char *p, *s, *h, *t, *pct_ptr, pct[8];
#else
    var p, pct;
#endif

    g("ous~","@oic~");

    while ((p = strchr(self,'@')) != NULL) {

#ifndef JS
	s = self; h = head; t = tail; pct_ptr = pct;
	while (s < p - lenpct)
	    *h++ = *s++;
	while (s < p)
	    *pct_ptr++ = *s++;
	s++; /* move '@' */
	while (*s)
	    *t++ = *s++;
	*pct_ptr = *h = *t = '\0';
#else
	head = self.substring(0, p-lenpct);
	pct  = self.substring(p-lenpct, p);
	tail = self.substring(p+1, self.length);
#endif

	/* pct が記号かどうかの判定 */
	/* 始端に達していたら置換   */

#ifndef JS
	if (pct[0] == '~' && pct[3] == '|' && pct[4] == '_') {
	    if (pct[1] == 'B' && pct[2] == 'G') {
#else
	if (pct.indexOf("~") == 0 && pct.indexOf("|_") == 3) {
	    if (pct.indexOf("BG") != -1) {
#endif
		strcpy(self,head);
		strcat(self,pct);
		strcat(self,"$A_");
		strcat(self,tail);
	    }
	    else {
		strcpy(self,head);
		strcat(self,"@");
		strcat(self,pct);
		strcat(self,tail);
	    }
	}
	else { /* pctが記号でない場合 */
	    g("iso@","@iso");
	    g("o@","@o");
	    g("thi@","@thi");
	    g("selen@","@selen");
	    g("tellur@","@tellur");
	    g("perox@","@perox");
	    g("fluorid@","@fluorid");
	    g("chlorid@","@chlorid");
	    g("bromid@","@bromid");
	    g("iodid@","@iodid");
	    g("hydrazid@","@hydrazid");
	    g("hydrazon@","@hydrazon"); /* 本当はない */
	    g("amid@","@amid");
	    g("imid@","@imid");
	    g("azid@","@azid");
	    g("nitrid@","@nitrid");
	    g("cyanid@","@cyanid");
	    g("cyanatid@","@cyanatid");
	    g("di@","@di");
	    g("tri@","@tri");
	    g("bis@","@bis");
	    g("phosphor@","$A_phosphor");
	    g("phosphon@","$A_phosphon");
	    g("phosphin@","$A_phosphin");
	    g("phosphen@","$A_phosphen");
	    g("arsen@","$A_arsen");
	    g("arson@","$A_arson");
	    g("arsin@","$A_arsin");
	    g("arsenen@","$A_arsenen");
	    g("stibon@","$A_stibon");
	    g("stibin@","$A_stibin");
	    g("@o","o@"); /* o だけしか動かないのは不可 */
	    if (p == strchr(self,'@')) { /* '@' が動かなければ */
		strcpy(self,head);
		strcat(self,pct);
		strcat(self,"$A_");
		strcat(self,tail);
	    }
	}
    } /* end while */
}
#endif /* LITE */



#ifndef NC
/********************************************************************
 **
 **  moveacid()
 **
 **  「酸」の位置の調整を行う
 **
 ********************************************************************/
/* 変数
    paren   カッコのネスト
    head    '@' の前の部分（グローバル）
    pct     '@' の直後の句読点
    tail    '@'の後の文字列を保持（グローバル）
 */
#endif /* NC */

#ifndef JS
void moveacid(void)
#else
function moveacid()
#endif
{

#ifndef JS
    int iv;
    char *p, *pp, *s, *h, *t, *pct_ptr, from[80], to[80], pct[8];
#else
    var p, pp, pct, from, to, iv;
#endif

    g("ic~", "~AC|_~");
    g("~AC|_~NL|_","~AC|_"); /* invert()から */

    g("~HY|_~CL|_~SP|_acid~","~HY|_~CL|_~"); /* diboric(2-) acid */

    g("|_acid~","|_@$SAN_~"); /* 酸 */

	/* ~AC|_(II) -> (II)~AC|_  */
    for (iv = 0; iv < sizeVa; iv++) {
	strcpy(from,"~AC|_");
	strcat(from, va[iv]);
	strcpy(to, va[iv]);
	strcat(to, "~AC|_");
	g(from,to);
    }

    while ((p = strchr(self,'@')) != NULL) {
	pp = strstr(self,"|_@"); /* '@' が記号の前であるか */

#ifndef JS
	s = self; h = head; t = tail; pct_ptr = pct;
	while (s < p-lenpct)
	    *h++ = *s++;
	while (s < p)
	    *pct_ptr++ = *s++;
	s++; /* out '@' */
	while (*s)
	*t++ = *s++;
	*pct_ptr = *h = *t = '\0';
#else
	head = self.substring(0, p-lenpct);
	pct  = self.substring(p-lenpct, p);
	tail = self.substring(p+1, self.length); /* '@'含まない */
#endif

	if (strEQ(pct,"~BG|_")) {
	    /* 前が始端なら '@' は削除 */
	    strcpy(self,head);
	    strcat(self,pct);
	    strcat(self,tail);
	} else if (strEQ(pct,"~AC|_")) {
	    /* "~AC|_@" となったら削除 */
	    strcpy(self,head);
	    strcat(self,tail);
	} else if (strEQ(pct,"~SP|_")) {
	    /* 途中の "~SP|_" は削除 */
	    strcpy(self,head);
	    strcat(self,"@");
	    strcat(self,tail);
	} else if (p == pp + 2) {
	   /* 前が記号なら '@' を前に移動 */
	    strcpy(self,head);
	    strcat(self,"@");
	    strcat(self,pct);
	    strcat(self,tail);
	} else {
	    strcpy(self,head);
	    strcat(self,pct);
	    strcat(self,tail);
	}
    } /* end while */
    g("~AC|_","$SAN_");
}


#ifndef NC
/********************************************************************
 **
 **  substnum()
 **
 **  数詞の置換を一般化する
 **
 **  substnum("?foo", "?bar", 3, 9); なら、
 **  g("trifoo", "tribar") などを 3〜9の範囲で行う。
 **  '?' の位置に倍数接頭辞があるものとみなす。
 **  fromとtoには、'?'が１個ずつ含まれなければならない。
 **  num[0] = "" なので、0 のときは ? のない置換を行う。
 **
 **  str0とstr1は自動変数なので、長さ管理を期待している。
 **  とりあえず長さは 64 とした。長すぎるものを渡してはいけない。
 **
 ********************************************************************/
#endif /* NC */

#ifndef JS
void substnum (char *from, char *to, int ini, int fin)
{
    char str0[64], str1[64], *p, *pp;
    int i;
#else
function substnum (from, to, ini, fin)
{
    var i, p, pp, str0, str1;
#endif
    p  = strchr(from,'?');
    pp = strchr(to,  '?');
    if (p == NULL || pp == NULL) { /* '?' を含まない */
	return;
    }
    if (ini < 0) {
	ini = 0;
    }
    if (fin >= sizeNm) {
	fin = sizeNm - 1;
    }

    for (i=fin; i>=ini; i--) { /* 0を最初にしてはダメ */

#ifndef JS
	memcpy(str0, from, p - from);
	str0[p - from] = '\0';
	strcat(str0, num[i]);
	strcat(str0, p + 1); /* '?' の次の文字から */

	memcpy(str1, to , pp - to);
	str1[pp - to] = '\0';
	strcat(str1, num[i]);
	strcat(str1, pp + 1);
#else
	str0 = from.substring(0, p) + num[i] +
		from.substring(p + 1, from.length);
	str1 = to.substring(0, pp) + num[i] +
		to.substring(pp + 1, to.length);
#endif
	g(str0,str1);
    }
    g("?",""); /* 余計な '?' があったときの用心 */
}



#ifndef NC
/********************************************************************
 **
 **  translnum()
 **
 **  数字・接頭辞の翻訳を行う（99まで）
 **
 ********************************************************************/
#endif /* NC */

#ifndef JS
void translnum ()
{
    char *p, *s, *d, *h, *t;
    int numpct;
#else
function translnum ()
{
    var p, pct, numpct;
#endif
    g("$","$TMP_$");

    while ((p = strstr(self,"$TMP_")) != NULL) {
	numpct = 0;

#ifndef JS
	/* 記号の部分は巻戻す */
	while (self + lenpct < p) {
	    if (memEQ(p-lenpct,"~",1) || memEQ(p-2,"|_",2)) {
		p -= lenpct; numpct++;
	    } else {
		break;
	    }
	}

	s = self; d = dest; h = head; t = tail;
	while (s < p)
	    *h++ = *s++;
	while (s < p + numpct * lenpct)
	    *d++ = *s++;
	while (s < p + (numpct+1) * lenpct)
	    s++;
	while (*s)
	    *t++ = *s++;
	*h = *t = *d = '\0';
#else
	while (lenpct < p) {
	    pct = self.substring(p-5,p);
	    if (pct.indexOf("~") == 0 && pct.indexOf("|_") == 3) {
		p -= lenpct; numpct++;
	    } else {
		break;
	    }
	}

	head = self.substring(0, p);
	dest = self.substring(p, p+numpct*lenpct);
	tail = self.substring(p + (numpct+1)*lenpct, self.length);
#endif

	strcpy(self, head); /* 記号の前まで */
	strcat(self, "$DUM_");
	strcat(self, dest); /* 記号群の部分 */
	strcat(self, tail); /* "$TMP_" の後 */
    } /* end while */

    g("hyper$",	"$TYO_$");
    g("super$",	"$PER_$");
    g("per$",	"$PER_$");
    g("sub$",	"$HYP_$");
    g("hypo$",	"$HYP_$");
    g("hemi$",	"$HAN_$");
    g("sesqui$","$3_$2_$");

    /* $NUM_ は数詞であることを示す */
    if (strmatch(self,"acont")) {
	g("acont$","aconta$");
	substnum("?triaconta$",  "$3_$10_$NUM_?$", 0, 9);
	substnum("?tetraconta$", "$4_$10_$NUM_?$", 0, 9);
	substnum("?pentaconta$", "$5_$10_$NUM_?$", 0, 9);
	substnum("?hexaconta$",  "$6_$10_$NUM_?$", 0, 9);
	substnum("?heptaconta$", "$7_$10_$NUM_?$", 0, 9);
	substnum("?octaconta$",  "$8_$10_$NUM_?$", 0, 9);
	substnum("?nonaconta$",  "$9_$10_$NUM_?$", 0, 9);
    }

    if (strmatch(self,"cos")) {
	g("heneicosa$", "$2_$10_$1_$");
	g("heneicos$",  "$2_$10_$1_$");
	g("henicosa$",  "$2_$10_$1_$");
	g("henicos$",   "$2_$10_$1_$");
	substnum("?cosa$", "$2_$10_$NUM_?$", 2, 9);
	substnum("?cos$",  "$2_$10_$NUM_?$", 2, 9);
	g("eicosa$", "$2_$10_$");
	g("eicos$",  "$2_$10_$");
	g("icosa$",  "$2_$10_$");
	g("icos$",   "$2_$10_$");
    }

    g("undeca$", "$10_$1_$");
    g("undec$",  "$10_$1_$");
    substnum("?deca$", "$10_$NUM_?$", 0, 9);
    substnum("?dec$",  "$10_$NUM_?$", 0, 9);

    g("$NUM_hen$","$1_$");
    g("$NUM_do$", "$2_$");

    g("mono$", "$1_$");
    g("di$",   "$2_$");
    g("tri$",  "$3_$");
    g("tetra$","$4_$");
    g("tetr$", "$4_$");
    g("penta$","$5_$");
    g("pent$", "$5_$");
    g("hexa$", "$6_$");
    g("hex$",  "$6_$");
    g("hepta$","$7_$");
    g("hept$", "$7_$");
    g("octa$", "$8_$");
    g("oct$",  "$8_$");
    g("nona$", "$9_$");
    g("non$",  "$9_$");

    g("$NUM_",""); /* "$NUM_" を除去 */
    g("$DUM_",""); /* "$DUM_" を除去 */
}



#ifndef NC
/********************************************************************
 **
 **  translele()
 **
 **  元素名の翻訳を行う
 **
 ********************************************************************/
#endif /* NC */

#ifndef JS
void translele ()
#else
function translele ()
#endif
{
    g("$", "~KK|_$");
    if (strmatch(self,"um")){
	g("lithium",   "$_RI_TI_QU_MU_");
	g("sodium",    "$_NA_TO_RI_QU_MU_");
	g("natrium",   "$_NA_TO_RI_QU_MU_");/*XXX*/
	g("potassium", "$_KA_RI_QU_MU_");
	g("kalium",    "$_KA_RI_QU_MU_");	/*XXX*/
	g("rubidium",  "$_RU_BI_ZI_QU_MU_");
	g("cesium",    "$_SE_SI_QU_MU_");
	g("francium",  "$_HU_RA_NN_SI_QU_MU_");
	g("beryllium", "$_BE_RI_RI_QU_MU_");
	g("magnesium", "$_MA_GU_NE_SI_QU_MU_");
	g("calcium",   "$_KA_RU_SI_QU_MU_");
	g("strontium", "$_SU_TO_RO_NN_TI_QU_MU_");
	g("barium",    "$_BA_RI_QU_MU_");
	g("radium",    "$_RA_ZI_QU_MU_");
	g("scandium",  "$_SU_KA_NN_ZI_QU_MU_");
	g("titanium",  "$_TI_TA_NN_");
	g("vanadium",  "$_BA_NA_ZI_QU_MU_");
	g("chromium",  "$_KU_RO_MU_");
	g("yttrium",   "$_QI_TT_TO_RI_QU_MU_");
	g("zirconium", "$_ZI_RU_KO_NI_QU_MU_");
	g("niobium",   "$_NI_QO_BU_");
	g("molybdenum","$_MO_RI_BU_DE_NN_");
	g("technetium","$_TE_KU_NE_TI_QU_MU_");
	g("ruthenium", "$_RU_TE_NI_QU_MU_");
	g("rhodium",   "$_RO_ZI_QU_MU_");
	g("palladium", "$_PA_RA_ZI_QU_MU_");
	g("cadmium",   "$_KA_DO_MI_QU_MU_");
	g("lanthanum", "$_RA_NN_TA_NN_");
	g("cerium",    "$_SE_RI_QU_MU_");
	g("praseodymium","$_PU_RA_SE_QO_ZI_MU_");
	g("neodymium", "$_NE_QO_ZI_MU_");
	g("promethium","$_PU_RO_ME_TI_QU_MU_");
	g("samarium",  "$_SA_MA_RI_QU_MU_");
	g("europium",  "$_YU_QU_RO_PI_QU_MU_");
	g("gadolinium","$_GA_DO_RI_NI_QU_MU_");
	g("ytterbium", "$_QI_TT_TE_RU_BI_QU_MU_");
	g("terbium",   "$_TE_RU_BI_QU_MU_");
	g("dysprosium","$_ZI_SU_PU_RO_SI_QU_MU_");
	g("holmium",   "$_HO_RU_MI_QU_MU_");
	g("erbium",    "$_QE_RU_BI_QU_MU_");
	g("thulium",   "$_TU_RI_QU_MU_");
	g("lutetium",  "$_RU_TE_TI_QU_MU_");
	g("protoactinium","$_PU_RO_TO_QA_KU_TI_NI_QU_MU_");
	g("actinium",  "$_QA_KU_TI_NI_QU_MU_");
	g("thorium",   "$_TO_RI_QU_MU_");

#ifndef LITE
	g("neptunium",  "$_NE_PU_TU_NI_QU_MU_");
	g("plutonium",  "$_PU_RU_TO_NI_QU_MU_");
	g("americium",  "$_QA_ME_RI_SI_QU_MU_");
	g("curium",     "$_KI_XU_RI_QU_MU_");
	g("berkelium",  "$_BA_HH_KU_RI_QU_MU_");
	g("californium","$_KA_RI_HO_RU_NI_QU_MU_");
	g("einsteinium","$_QA_QI_NN_SU_TA_QI_NI_QU_MU_");
	g("fermium",    "$_HU_LE_RU_MI_QU_MU_");
	g("mendelevium","$_ME_NN_DE_RE_BI_QU_MU_");
	g("nobelium",   "$_NO_HH_BE_RI_QU_MU_");
	g("lawrencium", "$_RO_HH_RE_NN_SI_QU_MU_");
	g("rutherfordium","$_RA_ZA_HO_HH_ZI_QU_MU_");
	g("dubnium",    "$_DO_BU_NI_QU_MU_");
	g("seaborgium", "$_SI_HH_BO_HH_GI_QU_MU_");
	g("bohrium",    "$_BO_HH_RI_QU_MU_");
	g("hassium",    "$_HA_TT_SI_QU_MU_");
	g("meitnerium", "$_MA_QI_TO_NE_RI_QU_MU_");
#endif /* LITE */

	g("hafnium",  "$_HA_HU_NI_QU_MU_");
	g("tantalum", "$_TA_NN_TA_RU_");
	g("rhenium",  "$_RE_NI_QU_MU_");
	g("osmium",   "$_QO_SU_MI_QU_MU_");
	g("iridium",  "$_QI_RI_ZI_QU_MU_");
	g("platinum", "$SIRO_$KIN_");
	g("aluminum", "$_QA_RU_MI_NI_QU_MU_");
	g("aluminium","$_QA_RU_MI_NI_QU_MU_");
	g("gallium",  "$_GA_RI_QU_MU_");
	g("indium",   "$_QI_NN_ZI_QU_MU_");
	g("thallium", "$_TA_RI_QU_MU_");
	g("germanium","$_GE_RU_MA_NI_QU_MU_");
	g("polonium", "$_PO_RO_NI_QU_MU_");
	g("helium",   "$_HE_RI_QU_MU_");
	g("selenium", "$_SE_RE_NN_");
	g("tellurium","$_TE_RU_RU_");
	g("uranium",  "$_QU_RA_NN_");

	g("muonium~", "$_MI_XU_QO_NI_QU_MU_~");
	g("muonium",  MUON("~AH|_"));
	g("protium",  "$_PU_RO_TI_QU_MU_");
	g("deuterium","$_ZI_XU_QU_TE_RI_QU_MU_");
	g("tritium",  "$_TO_RI_TI_QU_MU_");
    }

    g("manganese","$_MA_NN_GA_NN_");
    g("iron",     "$TETU_");
    g("copper",   "$DOU_");
    g("silver",   "$GIN_");
    g("gold",     "$KIN_");
    g("mercury",  "$SUI_$GIN_");

/* 末尾が不安な元素名 */
    if (strmatch(self,"on~") || strmatch(self,"on$")) {
	g("argon~",   "$_QA_RU_GO_NN_~");
	g("krypton~", "$_KU_RI_PU_TO_NN_~");
	g("xenon~",   "$_KI_SE_NO_NN_~");
	g("neon~",    "$_NE_QO_NN_~");
	g("radon~",   "$_RA_DO_NN_~");
	g("carbon~",  "$TAN_$SO_~");
	g("silicon~", "$_KE_QI_$SO_~");
	g("boron~",   "$_HO_QU_$SO_~");
    }
    g("sulfur~",   "$RYU_$OU_~");
    g("tungsten~", "$_TA_NN_GU_SU_TE_NN_~");
    g("wolfram~",  "$_TA_NN_GU_SU_TE_NN_~");
    g("cobalt~",   "$_KO_BA_RU_TO_~");
    g("nickel~",   "$_NI_TT_KE_RU_~");
    g("zinc~",     "$A_$NAM_~");
    g("bismuth~",  "$_BI_SU_MA_SU_~");
    if (strmatch(self,"gen")) {
	g("oxygen~",   "$SAN_$SO_~");
	g("halogen~",  "$_HA_RO_GE_NN_~");
	g("chalcogen~","$_KA_RU_KO_GE_NN_~");
	g("pnicogen~", "$_PU_NI_KO_GE_NN_~");
	g("hydrogen~", "$SUI_$SO_~");
	g("nitrogen~", "$TITU_$SO_~");
	g("hydrogenob",     "hydro~HN|_genob");
	g("hydrogenas",     "hydro~HN|_genas");
	g("hydrogenosome~", "hydro~HN|_genosome~");
	g("hydrogen",       HYDR("~AH|_"));
    }
    if (strmatch(self,"arsenic")) {
	g("arsenic~SP|_acid",     "$_HI_ic~SP|_acid");
	g("arsenic~SP|_amide",    "$_HI_ic~SP|_amide");
	g("arsenic~SP|_diamide",  "$_HI_ic~SP|_diamide");
	g("arsenic~SP|_triamide", "$_HI_ic~SP|_triamide");
	g("arsenic",	"$_HI_$SO_");
    }
    g("phosphorus",	"$_RI_NN_");
    g("lead",		"$NAM_");
    g("antimony",	"$_QA_NN_TI_MO_NN_");
    if (strmatch(self,"ine")) {
	g("fluorine",	"$_HU_TT_$SO_");
	g("chlorine",	"$EN_$SO_");
	g("bromine",	"$SYU_$SO_");
	g("iodine",	"$_YO_QU_$SO_");
	g("astatine",	"$_QA_SU_TA_TI_NN_");
    }

 /* 元素名の前の a は aqua か数詞くらい */
    if (strmatch(self,"tin")) {
	substnum("?tin", "?~SN|_tin", 4, 10);
	g("aquatin",	"aqua~SN|_tin");
	g("cosatin",	"cosa~SN|_tin");
	g("contatin",	"conta~SN|_tin");
	g("amminetin",	"ammine~SN|_tin");
	g("ylenetin",	"ylene~SN|_tin");
	g("idenetin",	"idene~SN|_tin");
	g("ynetin",	"yne~SN|_tin");
	g("oxytin",	"oxy~SN|_tin");
	g("ditin",	"di~SN|_tin");
	g("tritin",	"tri~SN|_tin");
	glookbehind("ol", "tin", "~SN|_tin");

	g("_tin~", "_$_SU_ZU_~");
	g("~SN|_", "");
    }
    g("~KK|_","");
    if (chrmatch(self,'$')) {
	translnum();
    }
}


#ifndef LITE
#ifndef NC
/********************************************************************
 **
 **  invert()
 **
 **   二元型命名法の倒置を行う
 **
 **  文字列の一時変数として、headをつかう
 **  （spaninvert() と抵触しないよう）
 **
 ********************************************************************/
/* 変数
    cnt_tok     トークン（成分）の個数
    electro[i]  i 番目のトークンの電荷。1:正, -1:負, 0:中性、2:正（倒置不可）.

    倒置可能な陰性成分の語尾は、
       a!e -> %I_ (-ate)
       i!e -> %O_ (-ite)
       i#e -> %D_ (-ide)
    と変換する。倒置できない -ide （〜化物）は、%B_ とする。
 */
#endif /* NC */

#ifndef JS
char * invert(char *str, int cnt_tok)
{
    char *p, *pp, **tok, **endptr, replace[4];
    char tmphydro[32]; /* 二水素など移動用バッファ */
    signed char localinv, salt, nolower, *electro, *ending;
    signed int i, iv, afterpos, cnt_i,
	firstneg, lenthis, lenhydro, afterneg;

    tok     = calloc(cnt_tok, sizeof(char *));
    endptr  = calloc(cnt_tok, sizeof(char *));
    electro = calloc(cnt_tok, sizeof(signed char));
    ending  = calloc(cnt_tok, sizeof(signed char));

    /* メモリが取れなければ何もしない */
    if (!tok || !endptr || !electro || !ending)
	return str;

#else
function invert(str, cnt_tok)
{
    electro = new Array(cnt_tok);
    endptr  = new Array(cnt_tok);
    ending  = new Array(cnt_tok);
    var localinv, i, iv, ival, salt, pct, afterpos,
	firstneg, afterneg, replace, lenhydro, hp;
#endif
    /* スペースによる分割 */
#ifndef JS
    p = str;
    for (i = 0; i < cnt_tok; i++) {
	while (*p == ' ')
	    ++p;

	if (*p) {
	    tok[i] = p++;
	    while (*p && *p != ' ')
		++p;
	    *p++ = '\0';
	}
	else
	    tok[i] = NULL;
    }
#else
    tok = str.split(" ");
#endif

    localinv = salt = 1; /* 初期値：倒置でき、塩類である */
    firstneg = -1;
    afterneg = cnt_tok;

#ifndef JS
    for (i = 0; i < cnt_tok; i++) {
	if (!tok[i]) break;

	p = endptr[i] = tok[i] + strlen(tok[i]);

	electro[i] = ending[i] = 0; /* initial value */

	/* 記号の部分は巻戻す */
	while (tok[i] + lenpct < p) {
	    if (memEQ(p-lenpct,"~",1) || memEQ(p-2,"|_",2)) {
		p -= lenpct;
	    } else {
		break;
	    }
	}

	/* 陰性成分風の語尾を探す */
	if (memEQ(p-3,"a!e",3) || memEQ(p-3,"%I_",3)) {
	    endptr[i] = p-3;
	    ending[i] = 1;
	    electro[i] = -1;
	}
	else if (memEQ(p-3,"i!e",3) || memEQ(p-3,"%O_",3)) {
	    endptr[i] = p-3;
	    ending[i] = 2;
	    electro[i] = -1;
	}
	else if (memEQ(p-3,"i#e",3) || memEQ(p-3,"%D_",3)) {
	    endptr[i] = p-3;
	    ending[i] = 3;
	    electro[i] = -1;
	}

	if (electro[i] < 0 && firstneg < 0) {
	    firstneg = i;
	}
	if (electro[i] == 0 && afterneg == cnt_tok && firstneg >= 0) {
	    afterneg = i;
	}
    }
#else
    for (i = 0; i < cnt_tok; i++) {
	endptr[i] = p = tok[i].length;

	electro[i] = ending[i] = 0;

	/* 記号の部分は巻戻す */
	while (lenpct < p) {
	    pct = tok[i].substring(p-lenpct, p);
	    if (pct.indexOf("~") == 0 && pct.indexOf("|_") == 3) {
		p -= lenpct;
	    } else {
		break;
	    }
	}

	/* 陰性成分風の語尾を探す */
	if (tok[i].substring(p-3,p) == "a!e" ||
	    tok[i].substring(p-3,p) == "%I_") {
	    endptr[i] = p-3;
	    ending[i] = 1;
	    electro[i] = -1;
	}
	else if (tok[i].substring(p-3,p) == "i!e" ||
		 tok[i].substring(p-3,p) == "%O_") {
	    endptr[i] = p-3;
	    ending[i] = 2;
	    electro[i] = -1;
	}
	else if (tok[i].substring(p-3,p) == "i#e" ||
		 tok[i].substring(p-3,p) == "%D_") {
	    endptr[i] = p-3;
	    ending[i] = 3;
	    electro[i] = -1;
	}

	if (electro[i] < 0 && firstneg < 0) {
	    firstneg = i;
	}
	if (electro[i] == 0 && afterneg == cnt_tok && firstneg >= 0) {
	    afterneg = i;
	}
    }
#endif

	/* 陰性成分以前のトークンが陽性成分に相応しいか */
    afterpos = firstneg;
#ifndef JS
    for (i = 0; i < firstneg; i++) {
	if (!tok[i]) break;

	p = tok[i] + strlen(tok[i]); /* '\0'の位置 */

	/* 記号の部分は巻もどす */
	while (tok[i] + lenpct < p) {
	    if (memEQ(p-lenpct,"~",1) || memEQ(p-2,"|_",2)) {
		p -= lenpct;
	    } else {
		break;
	    }
	}

	/* 翻訳語を含む : これだけではelectro[i]の値は未決定 */
	if (chrmatch(tok[i],'$')) {
	    electro[i] = 2;
	}
	else if (memEQ(p-3,"ium",3)) {
	    electro[i] = chrmatch(tok[i],'~') ? 2 : 1;
	    salt = 1;
	}
	else {
	    salt = 0;
	}

	/* トークンが完全に翻訳されている */
	pp = tok[i]; /* この関数内では pp はここだけ */
	nolower = 1;
	while (*pp) {
	    if (islower(*pp)) {
		nolower = 0;
	    }
	    pp++;
	}
	if (nolower) {
	    electro[i] = 1;
	}
	/* 語尾を探す */
	else if (memEQ(p-2,"ic",2)) {
	    if (memEQ(p-8,"cyanur",6)) {
		electro[i] = 2; salt = 1;
	    } else {
		electro[i] = 0; salt = 0;
	    }
	}
	else if (memEQ(p-3,"ous",3)) {
	    electro[i] = 0; salt = 0;
	}
	else if (memEQ(p-2,"yl",2)
	      || memEQ(p-7,"ylidene",7)
	      || memEQ(p-7,"ylidyne",7)
	      || memEQ(p-5,"ylene",5)
	      || memEQ(p-8,"glycerol",8)
	      || memEQ(p-9,"cellulose",9)) {
	    electro[i] = 1; salt = 0;
	}
	else if (memEQ(p-3,"ine",3)
	      && memNE(p-9,"phosphine",9)
	      && memNE(p-6,"arsine",6)
	      && memNE(p-7,"stibine",7)
	      && memNE(p-10,"bismuthine",10)) {
	    electro[i] = 2; salt = 1;
	}

	if (electro[i] == 0) {
	    afterpos = i; break;
	}
	else if (electro[i] != 1) {
	    localinv = 0;
	} /* 倒置できない */
    }  /* end while */
#else
    for (i = 0; i < firstneg; i++) {
	p = tok[i].length; /* 末尾の位置 */

	/* 記号の部分は巻戻す */
	while (lenpct < p) {
	    pct = tok[i].substring(p-lenpct, p);
	    if (pct.indexOf("~") == 0 && pct.indexOf("|_") == 3) {
		p -= lenpct;
	    } else {
		break;
	    }
	}

	/* 翻訳語を含む */ /* これだけではelectro[i]の値は未決定 */
	if (tok[i].indexOf('$') != -1) {
	    electro[i] = 2;
	}
	else if (tok[i].substring(p-3,p) == "ium") {
	    electro[i] = (tok[i].indexOf('~') != -1) ? 2 : 1;
	    salt = 1;
	}
	else{
	    salt = 0;
	}

	/* トークンが完全に翻訳されている */
	if (tok[i].toUpperCase() == tok[i]) {
	    electro[i] = 1;
	}
	/* 語尾を探す */
	else if (tok[i].substring(p-2,p) == "ic") {
	    if (tok[i].substring(p-8,p-2) == "cyanur") {
		electro[i] = 2; salt = 1;
	    } else {
		electro[i] = 0; salt = 0;
	    }
	}
	else if (tok[i].substring(p-3,p) == "ous") {
	    electro[i] = 0; salt = 0;
	}
	else if (tok[i].substring(p-2,p) == "yl"
	      || tok[i].substring(p-7,p) == "ylidene"
	      || tok[i].substring(p-7,p) == "ylidyne"
	      || tok[i].substring(p-5,p) == "ylene"
	      || tok[i].substring(p-8,p) == "glycerol"
	      || tok[i].substring(p-9,p) == "cellulose") {
	    electro[i] = 1; salt = 0;
	}
	else if (tok[i].substring(p-3,p) == "ine"
	      && tok[i].substring(p-9,p) != "phosphine"
	      && tok[i].substring(p-6,p) != "arsine"
	      && tok[i].substring(p-7,p) != "stibine"
	      && tok[i].substring(p-10,p) != "bismuthine") {
	    electro[i] = 2; salt = 1;
	}

	if (electro[i] == 0) {
	    afterpos = i; break;
	}
	else if (electro[i] != 1) {
	    localinv = 0;
	} /* 倒置できない */
    }  /* end while */
#endif

    /* 陽性成分も陰性成分も存在しないとき */
    if (firstneg <= 0 || afterneg <= 0) {
	localinv = 0; salt = 0;
    }
    /* 陰性成分の前のすべてが適切な陽性成分でないとき */
    if (afterpos != firstneg) {
	localinv = 0; salt = 0;
    }
    /* 陽性成分がなく、陰性成分が最初のとき */
    if (electro[0] == -1) {
	localinv = 0; salt = -1;
    }

    /* 水素塩の「水素」の移動 */
    if (localinv || salt) {
	for (i = firstneg; i < afterneg; i++) {

#ifndef JS
	    char *hp, *tp;

	    if (!tok[i]) break;

	    p = tok[i]; /* 先頭の位置 */
	    /* 記号の部分を進める */
	    while (p < tok[i] + strlen(tok[i]) - lenpct) {
		if (memEQ(p,"~",1) || memEQ(p+3,"|_",2)) {
		    p += lenpct;
		} else {
		    break;
		}
	    }

	    hp = strstr(tok[i], "~AH|_");
	    tp = strchr(p, '~');

	    /* 「水素酸」の水素ではなく、
		p と hp の間に記号がない */

	    if (hp && hp == tp &&
		memNE(hp + lenpct, "a!e", 3) &&
		memNE(hp + lenpct, "%I_", 3)) {
		lenhydro = lenpct; /* strlen(~AH|_); */

		lenthis = 0; /* 移動部の長さ */
		while (p < hp + lenhydro) {
		    lenthis++; p++;
		}

		/* 先行記号、酸、水素、後続記号の順 */
		memcpy(tmphydro, p-lenthis, lenthis);
		tmphydro[lenthis] = '\0';
		while (p < endptr[i] + 3) {
		    *(p-lenthis) = *p; p++;
		}

		/* phosphate(V)の(V)も移動 */
		for (iv = 0; iv < sizeVa; iv++) {
		    if (memEQ(p,va[iv],strlen(va[iv]))) {
			while (p < endptr[i] + 3 + strlen(va[iv])) {
			    *(p-lenthis) = *p; p++;
			}
			break;
		    }
		}
		memcpy(p-lenthis, tmphydro, lenthis);
		endptr[i] -= lenthis;
	    }
#else
	    var hp, tp;

	    p = 0; /* 先頭の位置 */
	    /* 記号の部分を進める */
	    while (tok[i].length - lenpct > p) {
		pct = tok[i].substring(p,p+lenpct);
		if (pct.indexOf("~") == 0 && pct.indexOf("|_") == 3) {
		    p += lenpct;
		} else {
		    break;
		}
	    }
	    hp = tok[i].indexOf("~AH|_");
	    tp = tok[i].substring(p,hp).indexOf('~');
	    if (tp == NULL &&
		hp != tok[i].indexOf("~AH|_a!e") &&
		hp != tok[i].indexOf("~AH|_%I_")) {

		lenhydro = lenpct; /* "~AH|_".length; */

		/* 先行記号、酸、水素、後続記号の順 */
		ival = -1;
		for (iv = 0; iv < sizeVa; iv++) {
		    if (tok[i].substring(endptr[i]+3,
			endptr[i]+3+va[iv].length) == va[iv]) {
			ival = iv; break;
		    }
		}

		tok[i] = tok[i].substring(0,p)
		    + tok[i].substring(hp+lenhydro,
		    endptr[i]+3+(ival >= 0 ? va[ival].length : 0))
		    + tok[i].substring(p,hp+lenhydro)
		    + tok[i].substring(
		    endptr[i]+3+(ival >= 0 ? va[ival].length : 0),
		    tok[i].length);
		endptr[i] -= hp + lenhydro - p;
	    }
#endif
	}
    }

	/* 並べなおし */
    if (localinv) { /* 倒置する二元化合物 */
	strcpy(head,""); /* 初期化 */
	cnt_i = 0;
	for (i = firstneg; i < afterneg; i++, cnt_i++) {
#ifndef JS
	    if (!tok[i]) break;
#endif
	    if (ending[i] == 1) {
		strcpy(replace,"%I_");
	    }
	    else if (ending[i] == 2) {
		strcpy(replace,"%O_");
	    }
	    else if (ending[i] == 3) {
		strcpy(replace,"%D_"); /* 〜化 */
	    }
#ifndef JS
	    memcpy(endptr[i],replace,3);
#else
	    tok[i] = tok[i].substring(0,endptr[i]) + replace
		+ tok[i].substring(endptr[i]+3,tok[i].length);
#endif
	    if (cnt_i && chrStrAt(tok[i], 0) == '~') /*記号の前に空白*/
		strcat(head, " ");
	    strcat(head, tok[i]);
	    strcat(head, "~QT|_"); /* 逆流止め */
	}

	for (i = firstneg-1; i >= 0; i--, cnt_i++) {
#ifndef JS
	    if (!tok[i]) break;
#endif
	    if (cnt_i && chrStrAt(tok[i], 0) == '~')
		strcat(head, " ");
	    strcat(head, tok[i]); /* 陽性成分は逆順 */
	    strcat(head, "~QT|_");
	}
	for (i = afterneg; i < cnt_tok; i++, cnt_i++) {
#ifndef JS
	    if (!tok[i]) break;
#endif
	    if (cnt_i && chrStrAt(tok[i], 0) == '~')
		strcat(head, " ");
	    strcat(head, tok[i]);
	    strcat(head, "~QT|_");
	}
    }
    else if (salt) { /* 倒置しない塩類 */
	strcpy(head,""); /* 初期化 */
	cnt_i = 0;
	for (i = firstneg-1; i >= 0; i--, cnt_i++) {
#ifndef JS
	    if (!tok[i]) break;
#endif
	    if (cnt_i)
		strcat(head, " ");
	    strcat(head, tok[i]); /* 陽性成分は正順 */
	    strcat(head, "~QT|_");
	}
	for (i = firstneg; i < afterneg; i++, cnt_i++) {
#ifndef JS
	    if (!tok[i]) break;
#endif
	    if (ending[i] == 1) {
		strcpy(replace,"%I_");
	    }
	    else if (ending[i] == 2) {
		strcpy(replace,"%O_");
	    }
	    else if (ending[i] == 3) {
		strcpy(replace,"%B_"); /* 〜化物 */
	    }
#ifndef JS
	    memcpy(endptr[i],replace,3);
#else
	    tok[i] = tok[i].substring(0,endptr[i]) + replace
		+ tok[i].substring(endptr[i]+3,tok[i].length);
#endif
	    if (cnt_i)
		strcat(head, " ");
	    strcat(head, tok[i]);
	    strcat(head, "~QT|_"); /* 逆流止め */
	    if (ending[i] == 1 || ending[i] == 2) {
		/*「塩」は最後 */
		if (salt > 0) {
		    strcat(head,"$EN_");
		}
	    }
	}
	for (i = afterneg; i < cnt_tok; i++, cnt_i++) {
#ifndef JS
	    if (!tok[i]) break;
#endif
	    strcat(head, "~QT|_");
	    if (cnt_i)
		strcat(head, " ");
	    strcat(head, tok[i]);
	}
    } else {
	for (i = 0; i < cnt_tok; i++) {
#ifndef JS
	    if (!tok[i]) break;
#endif
	    if (i == 0) {
		strcpy(head,tok[i]); /* 初期化 */
	    } else {
		strcat(head, " ");
		strcat(head, tok[i]);
	    }
	}
    }

#ifndef JS
	/* メモリの解放 */
    free(tok);
    free(endptr);
    free(electro);
    free(ending);
#endif

    return(head);
}
#endif /* LITE */



#ifndef LITE
#ifndef NC
/********************************************************************
 **
 **  spaninvert()
 **
 **   二元型命名法の倒置を行う範囲を定める
 **
 **  文字列の一時変数として、destとtailをつかう
 **  （invert() と抵触しないよう）
 **
 **  str0とstr1は自動変数なので、長さ管理を期待している。
 **  とりあえず長さは 32 とした。長すぎるものを渡してはいけない。
 **
 ********************************************************************/
 /* 変数
    paren   カッコのネストレベル
    lev     規定レベル
    cnt     トークンの数（スペースの個数＋1 に等しい）
 */
#endif /* NC */

#ifndef JS
void spaninvert(void)
{
    char *s, *d, *t;
    char str0[32], str1[32];
    int i, lev, paren, cnt, havenest;
#else
function spaninvert()
{
    var lev, paren, cnt, i, ch, to_tail;
    var str0, str1;
    var havenest, to_be_replaced;
#endif

    /* -ate の 't' を '!' で伏せる。例外は -ate に戻す */
    if (strmatch(self,"ate~")) {
	g("ate~", "@~");

	/* -olate for -olic acid */
	if (strmatch(self,"ol@")) {
	    g("fol@",        "fola!e");
	    g("chol@",       "chola!e");
	    g("catechola!e", "catecholate"); /*またまた戻す*/
	    g("dolichola!e", "dolicholate");
	    g("glycol@",     "glycola!e");
	    g("pipecol@",    "pipecola!e");
	    g("propiol@",    "propiola!e");
	    g("tetrol@",     "tetrola!e");
#ifndef LITE
	    g("behenol@",    "behenola!e");
	    g("labdanol@",   "labdanola!e");
	    g("mycol@",      "mycola!e");
	    g("nitrol@",     "nitrola!e");
	    g("nitrosol@",   "nitrosola!e");
	    g("niccol@",     "niccola!e");
	    g("helvol@",     "helvola!e");
	    g("oleanol@",    "oleanola!e");
	    g("reserpinol@", "reserpinola!e");
	    g("ursol@",      "ursola!e");
#endif /* LITE */
	}

	for (i=0; i < sizeNoAt; i++) {
	    strcpy(str0, noat[i]);
	    strcat(str0, "@");
	    strcpy(str1, noat[i]);
	    strcat(str1, "ate");
	    g(str0,str1);
	}
	g("@", "a!e");
    }

    /* -ide, -ite は決められたものだけ '#', '!' で伏せる */
    if (strmatch(self,"ite~")) {
	g("_ite~", "_i!e~");
	for (i=0; i < sizeIt; i++) {
	    strcpy(str0, it[i]);
	    strcat(str0, "ite~");
	    strcpy(str1, it[i]);
	    strcat(str1, "i!e~");
	    g(str0,str1);
	}
    }
    if (strmatch(self,"ide~")) {
	/* ("_ide~") は変えない */
	for (i=0; i < sizeId; i++) {
	    strcpy(str0, id[i]);
	    strcat(str0, "ide~");
	    strcpy(str1, id[i]);
	    strcat(str1, "i#e~");
	    g(str0,str1);
	}

	glookbehind("bcdfghijklmnpqrstuvwxz", "oxi#e",  "oxide");  /*aeoy*/
	glookbehind("bcdfghijklmnpqrstuvwxz", "azi#e",  "azide");  /*aeoy*/
	glookbehind("bcdfghijklmnpqrstuvwxz", "hali#e", "halide"); /*aeoy*/

	if (strmatch(self,"oxide~")) {
	    g("hydroxide~",	"hydroxi#e~");
	    g("suboxide~",	"suboxi#e~");
	    g("peroxide~",	"peroxi#e~");
	    g("dioxide~",	"dioxi#e~");
	    g("sesquioxide~",	"sesquioxi#e~");
	    g("trioxide~",	"trioxi#e~");
	    g("tetroxide~",	"tetroxi#e~");
	    g("pentoxide~",	"pentoxi#e~");
	    g("heptoxide~",	"heptoxi#e~");
	}
	g("diazide~",	"diazi#e~");
	g("triazide~",	"triazi#e~");
	g("dihalide~",	"dihali#e~");
	g("trihalide~",	"trihali#e~");

	g("hydriodi#e",	"hydriodide");
	g("anhydri#e",	"anhydride");
	g("glyceri#e",	"glyceride");
	g("molozoni#e",	"molozonide");

	g("hydro",   "hydro/I_");
	g("/I_per",  "per/I_");
	g("/I_poly", "poly/I_");
	g("/I_di",   "di/I_");
	substnum("/I_?",  "?/I_", 2, 11);
	g("/I_deca", "deca/I_");
	g("benzotri","benzotri/I_");

	g("/I_oxi#e",      "/I_oxide");
	g("/I_sulfi#e",    "/I_sulfide");
	g("/I_seleni#e",   "/I_selenide");
	g("/I_telluri#e",  "/I_telluride");
	g("/I_fluori#e",   "/I_fluoride");
	g("/I_chlori#e",   "/I_chloride");
	g("/I_bromi#e",    "/I_bromide");
	g("/I_iodi#e",     "/I_iodide");
	g("/I_hali#e",     "/I_halide");
	g("/I_halogeni#e", "/I_halogenide");
	g("/I_",  "");
    }

    for (lev = 0; lev <= invlev; lev++) {
	/* カッコを文字に変換 */
	if (lev == 0) {
	    g("~BG|_","<");
	}
	if (lev == 0) {
	    g("~FN|_",">");
	}
	g("~OP|_","(");
	g("~CL|_",")");
	g("~LS|_","[");
	g("~RS|_","]");
	g("~LB|_","{");
	g("~RB|_","}");
	g("~SP|_"," ");
	paren = 0;
	havenest=0;

#ifndef JS
	for (s = self; *s; ++s) {
	    /* 開きカッコはネストレベルを上げる */
	    if (*s == '(' || *s == '[' || *s == '{') {
		paren++;
		if (paren != lev) {
		    if      (*s == '<') *s = '\'';
		    else if (*s == '(') *s = '.';
		    else if (*s == '[') *s = ':';
		    else if (*s == '{') *s = '-';
		}
	    }
		
	    /* ネストレベルが対象外の空白は置換 */
	    if (*s == ' ' && paren != lev) {
		*s = '*';
		havenest = 1;
	    }

	    /* 閉じカッコはネストレベルを下げる */
	    if (*s == ')' || *s == ']' || *s == '}') {
		if (paren != lev) {
		    if      (*s == '>') *s = '\"';
		    else if (*s == ')') *s = ',';
		    else if (*s == ']') *s = ';';
		    else if (*s == '}') *s = '=';
		}
		paren--;
	    }
	} /* end while */
#else
	for (i = 0; i < self.length; i++) {
	    ch = self.substring(i,i+1);
	    to_be_replaced = 0;
	    /* 開きカッコはネストレベルを上げる */
	    if (ch == '(' || ch == '[' || ch == '{') {
		paren++;
		if ( paren != lev) {
		    if      (ch == '<') { ch = '\''; to_be_replaced = 1; }
		    else if (ch == '(') { ch = '.';  to_be_replaced = 1; }
		    else if (ch == '[') { ch = ':';  to_be_replaced = 1; }
		    else if (ch == '{') { ch = '-';  to_be_replaced = 1; }
		}
	    }

	    /* ネストレベルが対象外の空白は置換 */
	    if (ch == ' ' && paren != lev) {
		ch = '*'; to_be_replaced = 1;
		havenest = 1;
	    }

	    /* 閉じカッコはネストレベルを下げる */
	    if (ch == ')' || ch == ']' || ch == '}') {
		if ( paren != lev) {
		    if      (ch == '>') { ch = '\"'; to_be_replaced = 1; }
		    else if (ch == ')') { ch = ',';  to_be_replaced = 1; }
		    else if (ch == ']') { ch = ';';  to_be_replaced = 1; }
		    else if (ch == '}') { ch = '=';  to_be_replaced = 1; }
		}
		paren--;
	    }

	    if (to_be_replaced == 1) { /* 置換 */
		self = self.substring(0,i) +
			ch + self.substring(i+1,self.length);
	    }
	} /* end while */
#endif

	/* 対象外の記号を元に戻す */
	g("\'","~BG|_");
	g("\"","~FN|_");
	g(".","~OP|_");
	g(",","~CL|_");
	g(":","~LS|_");
	g(";","~RS|_");
	g("-","~LB|_");
	g("=","~RB|_");
	g("*","~SP|_");

#ifndef JS
	s = self; d = dest;
	while (*s) {
	/* 開きカッコから閉じカッコまで */
	    if (*s == '(' || *s == '[' || *s == '{' || *s == '<') {
		int trailsp = 0;

		*d++ = *s++;
		while (*s == ' ') /* 先頭の空白はinvertに渡さない */
		    *d++ = *s++;
		*d = '\0';

		cnt = 0; /* スペースの個数の初期化 */

		/* 閉じカッコの前までtailにコピー */
		t = tail;
		while (*s && *s != ')' && *s != ']' && *s != '}' && *s != '>')
		{
		    if (*s == ' ') { cnt++; } /* スペースの個数 */
		    *t++ = *s++;
		}

		/* 末尾の空白は別途コピーする */
		while (tail < t && t[-1] == ' ') {
		    --t;
		    --cnt;
		    ++trailsp;
		}

		*t = '\0';

		if (tail == t) {
		    1;
		}
		/* 空白しかなければinvert()しない */
		else if ((size_t)cnt == strlen(tail)) {
		    strcat(dest,tail);
		}
		/* 空白があればinvert() */
		else if (cnt) {
		    strcat(dest,invert(tail, cnt+1));
		}
		/* ネストがなければ */
		else if (! havenest) {
		    strcat(dest,invert(tail,1));
		}
		else {
		    strcat(dest,tail);
		}

		/* ポインタを'\0'の上に移動 */
		d = dest + strlen(dest);

		if (trailsp) {
		    while (trailsp--)
			*d++ = ' ';
		    *d = '\0';
		}

		/* 閉じカッコはwhileに戻ってからコピーされよう */
	    } else {
		*d++ = *s++;
	    }
	} /* end while */
	*d = '\0';
#else
	/* selfをスキャンする */
	dest = tail =  ""; /* 初期化 */
	cnt = to_tail = 0;
	for (i=0; i<self.length; i++) {
	    ch = self.substring(i,i+1);

	    /* 開きカッコから閉じカッコまで */
	    if (ch == '(' || ch == '[' || ch == '{' || ch == '<') {
		dest += ch; /* 開きカッコをコピー */
		to_tail = 1; /* 以降はtailにコピー */
	    } else if (ch == ')' || ch == ']' || ch == '}' || ch == '>') {
		/* 空白があればinvert() */
		if (cnt) {
		    dest += invert(tail, cnt+1); /* スペース + 1 */
		}
		/* ネストがなければ */
		else if (havenest == 0) {
		    dest += invert(tail, 1);
		}
		else {
		    dest += tail;
		}

		dest += ch; /* 閉じカッコをコピー */
		cnt = to_tail = 0; /* 再初期化 */
		tail = "";
	    } else if (to_tail == 1) {
		tail += ch;
		if (ch == ' ') cnt++; /* スペースの個数 */
	    } else {
		dest += ch;
	    }
	} /* end while */
#endif
	self2dest();
	g("<","~BG|_");
	g(">","~FN|_");
	g("(","~OP|_");
	g(")","~CL|_");
	g("[","~LS|_");
	g("]","~RS|_");
	g("{","~LB|_");
	g("}","~RB|_");
	g(" ","~SP|_");

    } /* end for (lev) */

    /* 元素陰イオンの解釈 */
    if (chrmatch(self,'%')) {
	g("%B_~", "%D_$BUTU_~");
	g("%B_",  "%D_"); /* hydrogen..ide */

	g("%I_", "%I_~NL|_"); /* ethyl acetate -> acetic~NL|_ethyl */
	g("%O_", "%O_~NL|_"); /* moveacid() まで ~NL|_ が必要 */

	/* bi- for translele() */
	g("biselen%I_",	"$OMO_selen%I_");
	g("bichrom%I_",	"$OMO_chrom%I_");

	g("sulf%I_",	"sulfuric");
	g("sulf%O_",	"sulfurous");
	g("selen%O_",	"selenious");
	g("phosph%I_",	"phosphoric");
	g("phosph%O_",	"phosphorous");
	g("arsen%I_",	"$_HI_ic");

	g("halogen%O_",	"$A_HA_RO_GE_NN_ic");
	g("stann%O_",	"$A_SU_ZU_ic");
	g("plumb%O_",	"$A_NA_MA_RI_ic");

	g("alumin%I_",	"$_QA_RU_MI_NN_ic");
	g("vanad%I_",	"vanadic");

	g("molybden%D_","$_MO_RI_BU_DE_NN_%D_");

	g("mangan%",	"$_MA_NN_GA_NN_%");
	g("ferr%",	"$TETU_%");
	g("cobalt%",	"$_KO_BA_RU_TO_%");
	g("nickel%",	"$_NI_TT_KE_RU_%");
	g("niccol%",	"$_NI_TT_KE_RU_%");
	g("cupr%",	"$DOU_%");
	g("zinc%",	"$A_$NAM_%");
	g("argent%",	"$GIN_%");
	g("stann%",	"$_SU_ZU_%");
	g("lanthan%",	"$_RA_NN_TA_NN_%");
	g("tantal%",	"$_TA_NN_TA_RU_%");
	g("tungst%",	"$_TA_NN_GU_SU_TE_NN_%");
	g("platin%",	"$SIRO_$KIN_%");
	g("oxylaur%",	"oxylaurin%");
	g("ylaur%",	"yl$KIN_%");
	g("laur%",	"laurin%");
	g("aur%",	"$KIN_%");
	g("mercur%",	"$SUI_$GIN_%");
	g("plumb%",	"$NAM_%");
	g("bismuth%",	"$_BI_SU_MA_SU_%");

	g("halogen%",	"$_HA_RO_GE_NN_%");
	g("chalcogen%",	"$_KA_RU_KO_GE_NN_%");
	g("pnict%",	"$_PU_NI_KO_GE_NN_%");
	g("neon%",	"$_NE_QO_NN_%");
	g("argon%",	"$_QA_RU_GO_NN_%");
	g("krypton%",	"$_KU_RI_PU_TO_NN_%");
	g("xenon%",	"$_KI_SE_NO_NN_%");
	g("radon%",	"$_RA_DO_NN_%");
    }

    if (strmatch(self,"%I_")) {
	/* gallate */
	g("~GL|_gall%I_",	"$MOT_ic");

	/* barate */
	g("ribar%I_",	"ribaRU_%I_");
	g("tribaRU_%I_",	"tribar%I_");

	/* cerate */
	g("glycer%I_",	"glycerin%I_");
	g("lignocer%I_",	"lignocerin%I_");
	glookbehind("cn",	"cer%I_", "ceRU_%I_");

	g(HYDR("~AH|_%I_"), "$SUI_$SO_ic");
    }

    /* 元素名にするためiumを付加 */
    if (strmatch(self,"%D_") || strmatch(self,"%I_")) {
	g("%I_", "ium~NL|_%I_");
	g("%D_", "ium~NL|_%D_");

	g("iium~NL|_%I_", "ium~NL|_%I_"); /* calciate */
	translele();

	/* 無駄なiumを削除 */
	g("ium~NL|_%I_", "%I_");
	g("ium~NL|_%D_", "%D_");
    }

    if (strmatch(self,"%I_")) {
	g("tartr%I_",	"tartaric");
	g("azel%I_",	"azelaic");
	g("%I_", "ic");
    }

    /* 亜酸 */
    g("o%O_", "ous"); /* thioite -> thious acid */
    g("%O_",  "ous");

/* 〜化物 */
    if (strmatch(self,"%D_")) {
	g("|_borohydr%D_~",  "|_hydr%D_~QT|_HO_QU_$SO_~"); /*XXX*/
	g("borohydr%D_",     "$_HO_QU_hydr%D_");
	g("borofluor%D_",    "$_HO_QU_fluor%D_");
	g("silicofluor%D_",  "$_KE_QI_fluor%D_");
	g("bifluor%D_",      "$OMO_fluor%D_");
	g("polysulf%D_",     "$OOI_sulf%D_");
	g("subox%D_",        "$A_ox%D_");
	g("superox%D_",      "$TYO_ox%D_");

	/* "%D_" を「〜化」に訳す */
	for (i=0; i < sizeIe; i++) {
	    g(ie[i],ka[i]);
	}
	g("%D_", "$KA_");
    }

/* 不要なものを戻す */
    g("a!e",	"ate");
    g("i!e",	"ite");
    g("i#e",	"ide");
}
#endif /* LITE */


#ifndef NC
/********************************************************************
 **
 **  jk()
 **
 **   字訳を行う変換関数
 **
 ********************************************************************/
#endif /* NC */

#ifndef JS
char * jk(char * engl)
#else

function set_inv (i) {
    inv = i;
}

function jk(engl)
#endif
{
#ifndef JS
    int i;  /* 繰り返し変数 */
    size_t len;
#else
    var i, len;
#endif

/* 例外処理のため空白文字を除去した文字列を作る */
    len = strlen(engl);
    if (!len) { /* 空行 */
	return "";
    }

/* 句読点や数字, HI-ASCIIのエスケープ */
    {
#ifndef JS
	unsigned char *fr = (unsigned char *)engl;
	unsigned char *to = (unsigned char *)self;
	char *e = engl + len;

	while (engl < e && e[-1] == ' ')
	    --e;
	*e = '\0'; /* 行末の空白を無視 */

	strcpy(self, "~BG|_");
	to += lenpct;

	while (*fr && *fr == ' ') /* 行先頭の空白を無視 */
	    ++fr;

	for (; *fr; fr++) {
	    if (isKANJI(*fr)) {
		*to++ = '~';
		*to++ = '^';
		*to++ = *fr++;
		*to++ = '|';
		*to++ = '_';

		*to++ = '~';
		if (*fr < 0x80) {
		    *to++ = '&';
		    *to++ = 0x80 | (unsigned char)*fr;
		}
		else {
		    *to++ = '^';
		    *to++ = *fr;
		}
		*to++ = '|';
		*to++ = '_';
	    }
	    else if (isalpha(*fr)) {
		*to++ = *fr;
	    }
	    else if (isprint(*fr)) { /* other than alpha */
		*to = '\0';
		for (i=0; i < sizeSy; i++) {
		    if (*fr == sy[i][0]) {
			strcat(self, es[i]);
			to += lenpct;
			break;
		    }
		}
		if (*fr == ' ') {
		    while (fr[1] == ' ')
			fr++;
		}
	    }
	    else {
		*to++ = '~';
		*to++ = '^';
		*to++ = *fr;
		*to++ = '|';
		*to++ = '_';
	    }
	}
	*to = '\0';
	strcat(self, "~FN|_");
#else
	strcpy(self, engl);
	g("~", ""); /* 使えない文字 */
	g("|","");
	g("_","~LW|_");
	while (strmatch(self,"  ")) {
	    g("  "," ");
	}
	self = "~BG|_" + self + "~FN|_";

	while (strmatch(self,"~BG|_ ")) {
	    g("~BG|_ ","~BG|_");
	}
	while (strmatch(self," ~FN|_")) {
	    g(" ~FN|_","~FN|_");
	}

	for (i=0; i < sizeSy; i++) {
	    if (sy[i] == '~' || sy[i] == '|' || sy[i] == '_')
		continue;
	    g(sy[i], es[i]);
	}

	dest = "";
	for (i=0; i< self.length;i++) {
	    if (self.charCodeAt(i) > 128) {
		dest +=  "~^" + self.charAt(i) + "|_";
	    } else {
		dest +=  self.charAt(i);
	    }
	}
	self = dest;
#endif
    }

    if (strEQ(self,"~BG|_~FN|_")) {
	return "";
    }

    /* OCT-8, NON-azoxy, -OSe- 用ラベル付け */
    g("_OCT~","_OCT~UP|_~");
    g("_NON~","_NON~UP|_~");
    g("_OSe~","_OS~UP|_e~"),

    /* neo-inositol */
    g("_neo~HY|_","_neo~LO|_~HY|_");

/* イタリックの判定と変換 */
/* これで訳すべき英字は小文字に揃う */
    cvtitalic();

/* 硫黄 */
    g("sulph","sulf");
    g("protactin", "protoactin");
    glookahead("caes", "aiy", "ces");

/*例外処理*/
    if (strEQ(self,"~BG|_acetic~SP|_anhydride~FN|_")) {
	strcpy(self, "~BG|_/A_acetic~SP|_acid~FN|_");
    }
    else if (strEQ(self,"~BG|_succinic~SP|_anhydride~FN|_")) {
	strcpy(self, "~BG|_/A_succinic~SP|_acid~FN|_");
    }
    else if (strEQ(self,"~BG|_maleic~SP|_anhydride~FN|_")) {
	strcpy(self, "~BG|_/A_maleic~SP|_acid~FN|_");
    }
    else if (strEQ(self,"~BG|_phthalic~SP|_anhydride~FN|_")) {
	strcpy(self, "~BG|_/A_phthalic~SP|_acid~FN|_");
    }
    else if (strEQ(self,"~BG|_cyanogen~FN|_")) {
	strcpy(self, "~BG|_dicyan~FN|_");
    }

    g("/A_", "$MU_$SUI_");

/*
 *  but-2-eneなどはbuta-2-eneとして字訳。
 */
    g("en","e%n"); /* enkephalin etc. */
    glookahead("e%n", "aeiouy~", "en");
    g("ylide~","y%lide~");

    g("~SP|_en",  "~SP|_e%n");
    g("~SP|_yn",  "~SP|_y%n");
    g("~SP|_yl",  "~SP|_y%l");
    g("~SP|_ulo", "~SP|_ul%o");
    euphony("en",  "a");
    euphony("yn",  "a");
    euphony("yl",  "a");
    euphony("ulo", "o");

    g("%",""); /* 戻す */
    g("aspartica~","asparagin$SAN_~"); /* aspartic-n-yl */
    g("glutamica~","glutamin$SAN_~");  /* glutamic-n-yl */

    /* OCT-8, NON-azoxy, -OSe-, neo-inositol のイタリック化 */
    g("_oct~UP|_~", "_~^O|_~^C|_~^T|_~");
    g("_non~UP|_~", "_~^N|_~^O|_~^N|_~");
    g("_OS~UP|_e~", "_~^O|_~^S|_~`E|_~");
    g("_neo~LO|_~HY|_inosit", "_~`N|_~`E|_~`O|_~HY|_inosit");
    g("~UP|_", "");
    g("~LO|_", "");

/*
 * 生化学関連の翻訳
 */
    if (strmatch(self,"~SP|_~")) {
	g("coenzyme~SP|_~^",	"coenzyme~SS|_~^");
	g("penicillin~SP|_~^",	"penicillin~SS|_~^");
	g("prostaglandin~SP|_~^",	"prostaglandin~SS|_~^");
	g("thromboxane~SP|_~^",	"thromboxane~SS|_~^");
	g("vitamin~SP|_~^",		"vitamin~SS|_~^");

	g("chlorophyll~SP|_~`",	"chlorophyll~SS|_~`");
	g("chlorophyllide~SP|_~`",	"chlorophyllide~SS|_~`");
	g("pheophytin~SP|_~`",	"pheophytin~SS|_~`");
	g("pheofarnesin~SP|_~`",	"pheofarnesin~SS|_~`");
	g("pheophorbide~SP|_~`",	"pheophorbide~SS|_~`");
    }

    g("~FN|_", "~SP|_~FN|_");
    g("~SP|_~^A|_~SP|_", "~SS|_~^A|_~SP|_");
    g("~SP|_~^B|_~SP|_", "~SS|_~^B|_~SP|_");
    g("~SP|_~^C|_~SP|_", "~SS|_~^C|_~SP|_");
    g("~SP|_~^D|_~SP|_", "~SS|_~^D|_~SP|_");
    g("~SP|_~^E|_~SP|_", "~SS|_~^E|_~SP|_");
    g("~SP|_~^F|_~SP|_", "~SS|_~^F|_~SP|_");
    g("~SP|_~^G|_~SP|_", "~SS|_~^G|_~SP|_");
    g("~SP|_~^H|_~SP|_", "~SS|_~^H|_~SP|_");
    g("~SP|_~^I|_~SP|_", "~SS|_~^I|_~SP|_");
    g("~SP|_~^P|_~SP|_", "~SS|_~^P|_~SP|_");
    g("~SP|_~^V|_~SP|_", "~SS|_~^V|_~SP|_");
    g("~SP|_~^X|_~SP|_", "~SS|_~^X|_~SP|_");
    g("~SP|_~FN|_", "~FN|_");

    g("~SP|_~^I|_~^",    "~SS|_~^I|_~^");
    g("~SP|_~^V|_~^",    "~SS|_~^V|_~^");
    g("~SP|_~^X|_~^",    "~SS|_~^X|_~^");
    g("|_~SS|_",  "|_~SP|_");

#ifndef LITE
    if (inv) {
	if (strmatch(self,"saccharide~")) {
	    g("monosaccharide~","$MONO_$TOU_~");
	    g("polysaccharide~","$OOI_$TOU_~");
	    g("saccharide~",	"$TOU_~");
	}
	if (strmatch(self,"lipid~")) {
	    g("glycolipid~", 	"$TOU_$SHI_$SITSU_~");
	    g("phospholipid~", 	"$_RI_NN_$SHI_$SITSU_~");
	    g("lipid~",		"$SHI_$SITSU_~");
	}
	if (strmatch(self,"protein~")) {
	    g("chromoprotein~",	"$IRO_$SO_TA_NN_PA_KU_$SITSU_~");
	    g("glycoprotein~",	"$TOU_TA_NN_PA_KU_$SITSU_~");
	    g("metalloprotein~","$KIN_$ZOKU_TA_NN_PA_KU_$SITSU_~");
	    g("nucleoprotein~",	"$KAKU_TA_NN_PA_KU_$SITSU_~");
	    g("phosphoprotein~","$_RI_NN_TA_NN_PA_KU_$SITSU_~");
	    g("protein~",	"$_TA_NN_PA_KU_$SITSU_~");
	}
	if (strmatch(self,"ase~")) {
	    g("codehydrogenase~","~BS|_$HO_$DAT_$SUI_$SO_$KOU_$SO_~");
	    g("decarboxylase~",	"~BS|_$DAT_$TAN_$SAN_$KOU_$SO_~");
	    g("dehydrogenase~",	"~BS|_$DAT_$SUI_$SO_$KOU_$SO_~");
	    g("duplicase~", 	"~BS|_$DUPL_$KOU_$SO_~");
	    g("hydrolase~", 	"~BS|_$ADD_$SUI_$DEC_$KOU_$SO_~");
	    g("oxidoreductase~","~BS|_$SAN_$KA_$RED_$KOU_$SO_~");
	    g("reductase~", 	"~BS|_$RED_$KOU_$SO_~");
	    g("replicase~", 	"~BS|_$DUPL_$KOU_$SO_~");
	    g("transaminase~",	"~BS|_QA_MI_NO_$KI_$TEN_$II_$KOU_$SO_~");
	    g("transcriptase~",	"~BS|_$TEN_$SYA_$KOU_$SO_~");
	    g("transferase~",	"~BS|_$TEN_$II_$KOU_$SO_~");
	}
	if (strmatch(self,"zyme~")) {
	    g("endoenzyme~",	"$CYT_$NAI_$KOU_$SO_~");
	    g("exoenzyme~",	"$CYT_$GAI_$KOU_$SO_~");
	    g("metalloenzyme~",	"$KIN_$ZOKU_$KOU_$SO_~");
	    g("coenzyme~",	"~BS|_$HO_$KOU_$SO_~");
	    g("isozyme~",	"QI_SO_$KOU_$SO_~");
	    g("enzyme~",	"$KOU_$SO_~");
	}
    } else {
	g("transferase~", "~BB|_transferase~"); /* 残す */
    }
#endif /*LITE*/

/*
 * 元素名の翻訳
 */
    g("|_monoxide~",	"|_monooxide~");
    g("|_phosphonitrile~","|_HO_SU_HO_NI_TO_RI_RU_~");
    g("|_cyanogen~",	"|_SI_QA_NN_~");

    g("pelargon",	"pelar/L_gon");
    g("hexenon",	"hex/L_enon");
    g("spiron",		"spi/L_ron");
    g("irone~",		"iro/L_ne~");
    g("sulfuryl",	"sul/L_furyl");
    if (strmatch(self,"uran")) { /* uranium */
	g("selenuran",	"selenu/L_ran");
	g("telluran",	"tellu/L_ran");
	g("kauran",	"kau/L_ran");
	g("furan",	"fu/L_ran"); /* and sulfuran */
	g("curan",	"cu/L_ran"); /* and mercuran */
    }
    g("galanthan",	"galan/L_than");
    g("antimonyl",	"anti/L_monyl");
    g("theobromine",	"theobro/L_mine"); /* a purine */
    g("_hydrocarbon~",	"_$TAN_$KA_$SUI_$SO_~");
    g("ferrosilicon",	"ferrosili/L_con");

    if (strmatch(self,"tin~")) {
	g("biotin~",	"biot/L_in~");
	g("carotin~",	"carot/L_in~");
	g("cresotin~",	"cresot/L_in~");
	g("cefalotin~",	"cefalot/L_in~");
	g("indigotin~",	"indigot/L_in~");
	g("narcotin~",	"narcot/L_in~");
	g("nicotin~",	"nicot/L_in~");
	g("parotin~",	"parot/L_in~");
	g("voachalotin~","voachalot/L_in~");
    }
    translele(); /* invert() の前に翻訳が必要 */
    /* g("/L_", ""); まだ消さない */

#ifndef LITE
/* 第一塩、第二塩 */
    if (strmatch(self,"ic~") || strmatch(self,"ous~")) {
	g("ic~SP|_",	"ic~DA|_~SP|_");
	g("ous~SP|_",	"ous~DA|_~SP|_");
	g("ic~FN|_",	"ic~DA|_~FN|_");
	g("ous~FN|_",	"ous~DA|_~FN|_");

	g("~DA|_~SP|_~",	"~SP|_~");
	g("~DA|_~SP|_acid",	"~SP|_acid");

	g("antimonous~DA|_~",	"$DAI_$1_QA_NN_TI_MO_NN_~");
	g("antimonic~DA|_~",	"$DAI_$2_QA_NN_TI_MO_NN_~");
	g("argentous~",		"$DAI_$1_$GIN_~");
	g("argentic~",		"$DAI_$2_$GIN_~");
	g("_aurous~",		"_$DAI_$1_$KIN_~");
	g("_auric~DA|_~",	"_$DAI_$2_$KIN_~");
	g("chromous~",		"$DAI_$1_KU_RO_MU_~");
	g("chromic~DA|_~",	"$DAI_$2_KU_RO_MU_~");
	g("cobaltous~",		"$DAI_$1_KO_BA_RU_TO_~");
	g("cobaltic~",		"$DAI_$2_KO_BA_RU_TO_~");
	g("cuprous~",		"$DAI_$1_$DOU_~");
	g("cupric~",		"$DAI_$2_$DOU_~");
	g("ferrous~",		"$DAI_$1_$TETU_~");
	g("ferric~",		"$DAI_$2_$TETU_~");
	g("manganous~",		"$DAI_$1_MA_NN_GA_NN_~");
	g("manganic~DA|_~",	"$DAI_$2_MA_NN_GA_NN_~");
	g("mercurous~",		"$DAI_$1_$SUI_$GIN_~");
	g("mercuric~",		"$DAI_$2_$SUI_$GIN_~");
	g("nickelous~",		"$DAI_$1_NI_TT_KE_RU_~");
	g("nickelic~",		"$DAI_$2_NI_TT_KE_RU_~");
	g("palladous~",		"$DAI_$1_PA_RA_ZI_QU_MU_~");
	g("palladic~",		"$DAI_$2_PA_RA_ZI_QU_MU_~");
	g("platinous~",		"$DAI_$1_$SIRO_$KIN_~");
	g("platinic~DA|_~",	"$DAI_$2_$SIRO_$KIN_~");
	g("plumbous~DA|_~",	"$DAI_$1_$NAM_~");
	g("plumbic~DA|_~",	"$DAI_$2_$NAM_~");
	g("stannous~DA|_~",	"$DAI_$1_SU_ZU_~");
	g("stannic~DA|_~",	"$DAI_$2_SU_ZU_~");
	g("thallous~",		"$DAI_$1_TA_RI_QU_MU_~");
	g("thallic~",		"$DAI_$2_TA_RI_QU_MU_~");

	g("~DA|_",	"");
    }
#endif /* LITE */

    /* ~GL|_ for 没食子酸; gallate(III) etc. to gallium */
    if (strmatch(self,"gallate~")) {
	g("|_gallate~",		"|_~GL|_gallate~");
	g("|_~GL|_gallate~OP|_","|_gallate~OP|_");
	g("pyrogallate~",	"pyro~GL|_gallate~");
	g("subgallate~",	"sub~GL|_gallate~");
    }

/*
 * 二元型化合物翻訳名の倒置
 */
#ifndef LITE
    if (inv) { spaninvert(); }
#endif /* LITE */

    g("/L_", ""); /* translele() */
    g("~GL|_","");

    g(HYDR("~AH|_~"), "$SUI_$SO_~");
    g(MUON("~AH|_~"), "$_MI_XU_QO_NI_QU_MU_~");

    g(HYDRSTR, "hydrogen");
    g(MUONSTR, "muonium");
    g("~AH|_ate", "ate");
    g("~AH|_", "~NL|_");
    g("~HN|_", "");

    g("ammonium~", "$_QA_NN_MO_NI_QU_MU_~"); /* 学術 diammonium */

/*
 * 酸の翻訳名
 */
    if (strmatch(self,"ic~")) {
	g("hydrohalic~",	"$_HA_RO_GE_NN_$KA_$SUI_$SO_ic~");
	g("hydrohalogenic~",	"$_HA_RO_GE_NN_$KA_$SUI_$SO_ic~");
	g("hydrochloric~",	"$EN_ic~");
	g("hydrobromic~",	"$SYU_$KA_$SUI_$SO_ic~");
	g("hydriodic~",		"$_YO_QU_$KA_$SUI_$SO_ic~");
	g("hydroiodic~",	"$_YO_QU_$KA_$SUI_$SO_ic~");
	g("hydrofluoric~",	"$_HU_TT_$KA_$SUI_$SO_ic~");
	g("hydroisocyanic~",	"$_QI_SO_SI_QA_NN_$KA_$SUI_$SO_ic~");
	g("hydrocyanic~",	"$_SI_QA_NN_$KA_$SUI_$SO_ic~");
	g("hydrazoic~",		"$_QA_ZI_$KA_$SUI_$SO_ic~");

#ifndef LITE
	g("hydrosulfuric~",	"$RYU_$KA_$SUI_$SO_ic~");
	g("hydroselenic~",	"$_SE_RE_NN_$KA_$SUI_$SO_ic~");
	g("hydrotelluric~",	"$_TE_RU_RU_$KA_$SUI_$SO_ic~");

	g("mucobromic~",	"mucoBU_romic~");
	g("mucochloric~",	"mucoKU_loric~");

	glookbehind("aiueoylmnr_", "halic~", "$_HA_RO_GE_NN_ic~");
	g("halogenic~",	"$_HA_RO_GE_NN_ic~");
	g("astatic~",	"$_QA_SU_TA_TI_NN_ic~");
#endif /* LITE */

	g("fluoric~",	"$_HU_TT_$SO_ic~");
	g("chloric~",	"$EN_$SO_ic~");
	g("bromic~",	"$SYU_$SO_ic~");
	g("iodic~", 	"$_YO_QU_$SO_ic~");
	g("sulfuric~",	"/B_$RYU_ic~");
	g("selenic~",	"/B_$_SE_RE_NN_ic~");
	g("telluric~",	"$_TE_RU_RU_ic~");
	g("nitric~",	"$SYO_ic~");
	g("phosphoric~","$_RI_NN_ic~");
	g("fulminic~",	"$RAI_ic~");
	g("carbonic~",	"/B_$TAN_ic~");
	g("borosilicic~","$_HO_QU_KE_QI_ic~");
	g("silicic~",	"$_KE_QI_ic~");
	g("boric~", 	"$_HO_QU_ic~");
	g("chromic~",	"/B_$_KU_RO_MU_ic~");
	g("manganic~",	"$_MA_NN_GA_NN_ic~");

#ifndef LITE
	g("antimonic~",	"$_QA_NN_TI_MO_NN_ic~");
	g("stibic~",	"$_QA_NN_TI_MO_NN_ic~");
	g("stannic~",	"$_SU_ZU_ic~");
	g("plumbic~",	"$NAM_ic~");
	g("titanic~",	"$_TI_TA_NN_ic~");
	g("vanadic~",	"$_BA_NA_ZI_NN_ic~");
	g("niobic~",	"$_NI_QO_BU_ic~");
	g("molybdic~",	"$_MO_RI_BU_DE_NN_ic~");
	g("technetic~",	"$_TE_KU_NE_TI_QU_MU_ic~");
	g("tantalic~",	"$_TA_NN_TA_RU_ic~");
	g("tungstic~",	"$_TA_NN_GU_SU_TE_NN_ic~");
	g("wolframic~",	"$_TA_NN_GU_SU_TE_NN_ic~");
	g("rhenic~",	"$_RE_NI_QU_MU_ic~");
	g("osmic~", 	"$_QO_SU_MI_QU_MU_ic~");
	g("platinic~",	"$SIRO_$KIN_ic~");

	g("hexen", "hex/L_en");
	g("xenoic~",	"$_KI_SE_NO_NN_ic~");
	g("xenonic~",	"$_KI_SE_NO_NN_ic~");
	g("/L_", "");
#endif /* LITE */

	g("basic~", 	"$EN_$KI_ic~");
    }

/*
 * 亜酸
 */
    if (strmatch(self,"ous~")) {
	g("fluorous~",	"$A_HU_TT_$SO_ic~");
	g("chlorous~",	"$A_$EN_$SO_ic~");
	g("bromous~",	"$A_$SYU_$SO_ic~");
	g("iodous~",	"$A_YO_QU_$SO_ic~");
	g("halous~",	"$A_halogenic~");
	g("halogenous~","$A_halogenic~");
	g("sulfurous~",	"/B_$A_$RYU_ic~");
	g("selenious~",	"/B_$A_selenic~");
	g("|_tellurous~","|_$A_telluric~");
	g("dithionous~","$A_dithionic~"); /* 亜二チオン酸ではない */
	substnum("?decathionous~","$A_?decathionic~",2,9);
	substnum("?thionous~","$A_?thionic~",3,11);
	g("nitrous~",	"$A_$SYO_ic~");
	g("phosphorous~","$A_RI_NN_ic~");
	g("arsenous~",	"$A_HI_ic~");
	g("arsenious~",	"$A_HI_ic~");
	g("antimonous~","$A_QA_NN_TI_MO_NN_ic~");
	g("stannous~",	"$A_SU_ZU_ic~");
	g("plumbous~",	"$A_NA_MA_RI_ic~");
#ifndef LITE
	ousacid(); /* 類型亜酸 */
#endif
    }

/*
 * 有機酸翻訳名
 */
    if (strmatch(self,"ic~")) {
#ifndef LITE
	g("kojic~",	"$_koujiic~");
	g("shikimic~",	"$_sikimiic~");
	g("chrysanthemic~","$KIKU_ic~");
	g("chrysanthemumic~","$KIKU_ic~");
	g("squaric~",	"$4_$KADO_ic~");
	g("quadratic~",	"$4_$KADO_ic~");
	g("thujic~",	"thuyaic~");
	g("atrolactic~","atrolactinic~"); /* lactic より前*/
	g("citramalic~","citraMA_lic~"); /* malic より前*/
	g("itamalic~",	"itaMA_lic~"); /* malic より前*/
#endif /* LITE */
	g("oxalacetic~","oxalo$SAKU_ic~");
	g("acetic~",	"$SAKU_ic~");
	g("butyric~",	"$RAKU_ic~");
	g("valeric~",	"$VL_ic~");
	g("benzoic~",	"$BZ_ic~");
	g("gallic~",	"$MOT_ic~");
	g("carbolic~",	"$SEKI_$TAN_ic~");
	g("cinnamic~",	"$_KE_QI_$HI_ic~");
	g("camphoric~",	"$_SI_XO_QU_NO_QU_ic~");
	g("lactic~",	"$NYU_ic~");
	g("tartaric~",	"/B_$SAKE_$SEKI_ic~");
	g("formic~",	"$_GI_ic~");
	g("mesoxalic~",	"meso$_SI_XU_QU_ic~");
	g("binoxalic~",	"$OMO_SI_XU_QU_ic~");
	g("oxalic~",	"$_SI_XU_QU_ic~");
	g("succinic~",	"/B_$_KO_HA_KU_ic~");
	glookbehind("aeioyl_", "malic~","/B_$_RI_NN_GO_ic~");
	g("citric~",	"$_KU_QE_NN_ic~");
	g("folic~", 	"$YOU_ic~");
	g("nucleic~",	"$KAKU_ic~");
	g("mucic~", 	"$NENEK_ic~");
	g("saccharic~", "$TOU_ic~");
	g("clupanodonic~","$_QI_WA_SI_ic~");
	g("_resinic~",	"_$TREE_$SHI_ic~"); /* for resinate */
    }

    g("biphthalic~",	"$OMO_phthalic~");
    g("bi/B_", "$OMO_");
    g("/B_", "");

/* ハロゲン化水素塩 */
    if (inv && strmatch(self,"ide~")) {
	g("hydrofluoride~",	"$_HU_TT_$KA_$SUI_$SO_$SAN_$EN_~");
	g("hydrochloride~",	"$EN_$SAN_$EN_~");
	g("hydrobromide~",	"$SYU_$KA_$SUI_$SO_$SAN_$EN_~");
	g("hydriodide~",	"$_YO_QU_$KA_$SUI_$SO_$SAN_$EN_~");
	g("hydroiodide~",	"$_YO_QU_$KA_$SUI_$SO_$SAN_$EN_~");
	g("hydrohalide~",	"$_HA_RO_GE_NN_$KA_$SUI_$SO_$SAN_$EN_~");
	g("hydrohalogenide~",	"$_HA_RO_GE_NN_$KA_$SUI_$SO_$SAN_$EN_~");
    }

/*
 * その他の翻訳語
 */
    g("deuter","ZI_XU_QU_TE_r");
    g("muon","MI_XU_on");
    g("prometh","PU_RO_ME_th");
    glookahead("europ",  "ay", "YU_QU_rop"); /* e-uroporphyrin */
    glookahead("europi", "do", "YU_QU_ropi");
    g("yttri","QI_TT_TO_RI_");

    g("berkel",    "BA_HH_KU_l");
    g("einstein",  "QA_QI_NN_stain");
    g("nobel",     "NO_HH_BE_l");
    g("lawrenc",   "RO_HH_RE_NN_c");
    g("rutherford","RA_ZA_HO_HH_d");
    g("dubn",      "DO_BU_n");
    g("seaborg",   "SI_HH_BO_HH_g");
    g("meitner",   "MA_QI_TO_NE_r");
    g("tungst",    "TA_NN_GU_st");
    g("perruthen", "PE_RU_RU_TE_n");
    g("perrhod",   "PE_RU_RO_d");
    g("perrhen",   "PE_RU_RE_n");
    g("perhal",    "PE_RU_HA_l");

    if (strmatch(self,"cur")) {
	g("curan",	"KU_ran");
	g("mercurochrom","MA_HH_KI_XU_RO_chrom");
	g("mercur",	"ME_RU_KU_r");
	g("tubocurar",	"tubokurar");
	/* curium */
	glookahead("cur",  "ay", "KI_XU_r");
	glookahead("curi", "do", "KI_XU_ri");
    }

    g("conjugate",	"$CONJ_");
    g("$CONJ_~SP|_acid","$CONJ_$SAN_");
    g("_inner~",	"_$MOL_$NAI_~");
    g("protonated",	"proton$KA_");

    g("anhydride",	"$MU_$SUI_$BUTU_");
    g("carbohydrate",	"$TAN_$SUI_$KA_$BUTU_");
    g("hydrate",	"$SUI_$WA_$BUTU_");
    g("ammoniate",	"$_QA_NN_MO_NI_QA_$WA_$BUTU_");
    g("atom~",		"~BS|_$ATOM_~");

    glookbehind(VOWEL, "acid~", "$SAN_~"); /* |_acid~ はまだ変換不可 */

    g("_salt~", 	"_~BS|_$EN_~");
    g("_group~", 	"_~BS|_$KI_~");
    g("_base~", 	"_~BS|_$EN_$KI_~");
    g("_residue~", 	"_~BS|_$ZAN_$KI_~");
    g("_ring~", 	"_~BS|_$KAN_~");
    g("_nucleus~",	"_~BS|_$KAKU_~");
    g("_compound~",	"_~BS|_$KA_$GOU_$BUTU_~");
    g("_species~",	"_~BS|_$SHU_~");
    g("_sugar~",	"_~BS|_$TOU_~");
    g("_glass~",	"_~BS|_GA_RA_SU_~");
    g("_alum~", 	"_~BS|_MI_XO_QU_BA_NN_~");
    g("_amalgam~", 	"_~BS|_QA_MA_RU_GA_MU_~");
    g("_metal~",	"_~BS|_$KIN_$ZOKU_~");
    g("_bile~",		"_~BS|_$BILE_~");
    g("_resin~",	"_~BS|_$TREE_$SHI_~");

    g("_cyclorubber~",	"_~BS|_$KAN_$KA_GO_MU_~");
    g("_rubber~",	"_~BS|_GO_MU_~");
    g("_water~",	"_~BS|_$SUI_~");

    g("_alcohol",	"_~BS|_alcohol"); /* also alcoholate*/
    g("_glycol~",	"_~BS|_glycol~");
    if (strmatch(self,"radical~")) {
	g("_radical~",	"_~BS|_radical~");
	g("_biradical~","_~BS|_biradical~");
	g("_diradical~","_~BS|_diradical~");
	substnum("_?radical~", "_~BS|_?radical~", 3,11);
    }
    if (strmatch(self,"ion~")) {
	g("_zwitterion~","_~BS|_$SOU_$SEI_ion~");
	g("_cation~",	"_~BS|_cation~");
	g("_anion~",	"_~BS|_anion~");
	g("_dication~",	"_~BS|_dication~");
	g("_dianion~",	"_~BS|_dianion~");
	substnum("_?cation~",  "_~BS|_?cation~",  3,11);
	substnum("_?anion~",   "_~BS|_?anion~",   3,11);
	g("_ion~",  	"_~BS|_ion~");
    }
    if (strmatch(self,"or~")) {
	if (inv) {
	    g("_donor~",	"_~BS|_$DON_$BODY_~");
	    g("_acceptor~",	"_~BS|_$ACC_$BODY_~");
	    g("_receptor~",	"_~BS|_$ACC_$BODY_~");
	    g("_factor~",	"_~BS|_$FAC_~");
	    g("_cofactor~",	"_~BS|_$HO_$FAC_~");
	} else {
	    g("_donor~",	"_~BS|_donah~");
	    g("_acceptor~",	"_~BS|_akceptah~");
	    g("_receptor~",	"_~BS|_receptah~");
	    g("_factor~",	"_~BS|_factah~");
	    g("_cofactor~",	"_~BS|_cofactah~");
	}
    }
    g("_deficient~",	"_~BS|_$HUSOK_~");
    g("_excess~",	"_~BS|_$KAJO_~");
    g("_active~SP|_~",	"_$KAT_$SEI_~SP|_~");

    g("~CM|_~SP|_~BS|_","~CM|_~SP|_"); /* comma + space */
    g("~SP|_~BS|_",	"~BB|_"); /* 空白の代わりに残す */
    g("~BS|_",		"");

    if (strmatch(self,"al~")) {
	g("_achiral~",	"_QA_KI_RA_RU_~PS|_~");
	g("_chiral~",	"_KI_RA_RU_~PS|_~");
	g("_normal~",	"_NO_RU_MA_RU_~PS|_~");
    }
    if (strmatch(self,"ary~")) {
	g("_primary~",    "_$DAI_$1_$KYU_~PS|_~");
	g("_secondary~",  "_$DAI_$2_$KYU_~PS|_~");
	g("_tertiary~",   "_$DAI_$3_$KYU_~PS|_~");
	g("_quaternary~", "_$DAI_$4_$KYU_~PS|_~");
    }
    if (strmatch(self,"cyclic")) {
	g("_cyclic~",	"_$KAN_$JOU_~PS|_~");
	g("acyclic",	"$NON_$KAN_$SIKI_~PS|_");
	g("alicyclic",	"$SHI_$KAN_$SIKI_~PS|_");
	g("monocyclic",	"$MONO_$KAN_$SIKI_~PS|_");
	g("bicyclic",	"$2_$KAN_$SIKI_~PS|_");
	g("polycyclic",	"$OOI_$KAN_$SIKI_~PS|_");
	g("cyclic~",	"$KAN_$SIKI_~PS|_~");
    }
    g("_racemic~",	"_RA_SE_MI_~PS|_~");
    g("antiaromatic",	"$ANTI_$AR_$ZK_~PS|_");
    g("aromatic",	"$AR_$ZK_~PS|_");
    g("aliphatic",	"$SHI_$BOU_$ZK_~PS|_");
    g("inorganic",	"$MU_$KIY_~PS|_");
    g("organic",	"$YUU_$KIY_~PS|_");
    g("organometallic",	"$YUU_$KIY_$KIN_$ZOKU_~PS|_");

    g("~PS|_~SP|_",	"~BB|_"); /* 空白の代わりに残す */
    g("~PS|_",		"");

    g("_fatty~SP|_",	"_$SHI_$BOU_");
    g("_fatty~HY|_",	"_$SHI_$BOU_");
    g("_fatty~",	"_$SHI_$BOU_~");

    g("_graphite~",	"_$KURO_$NAM_~");
    g("_diamond~",	"_DA_QI_YA_MO_NN_DO_~");
    g("_starch~",	"_$_DE_NN_PU_NN_~");
    g("_tar~",		"_TA_HH_RU_~");

/*
 * urea関係
 */
    if (strmatch(self,"ur")) {
	g("urea~",	"$NYO_$SO_~");
	g("oxaluric~",	"QO_xaluRU_ic~");
	g("maleur",	"MA_RE_QU_r");
	g("lauric~",	"laurinic~");
	glookbehind("eioy_", "auric~","$KIN_ic~");
	g("hippuric~",	"$UMA_$NYO_ic~");
	g("yluric~",	"yl$NYO_ic~");
	glookbehind("eioy_", "uric~","$NYO_ic~");
	g("glycoluril","glycol~NL|_uril");
    }

/*
 *  倍数接頭辞などの翻訳
 */
    if (chrmatch(self,'$')) {
	translnum();
    }

/*
 * 翻訳は以上。以下は字訳。
 */
/*
 * 置換官能基による母音脱落
 */
    g("monoxide","monooxide");
    g("amid",	"@Amid");
    g("amin",	"@Amin");
    g("ol~",	"@Ol~");
    g("one~",	"@One~");
    g("oxid",	"@Oxid");

    if (chrmatch(self,'@')) {
	g("acetohex@Amid", "acetohexamyd");
	glookbehind(LOWER, "non@Amid", "nonamid");

	g("tetr@",	"tetra@");
	g("pent@",	"penta@");
	g("hex@",	"hexa@");
	g("hept@",	"hepta@");
	g("oct@",	"octa@");
	g("non@",	"nona@");
	g("dec@",	"deca@");
	g("icos@",	"icosa@");
	g("acos@",	"acosa@");
	g("docos@",	"docosa@");
	g("triacont@","triaconta@");
	substnum("?cont@","?conta@",4,9);
	g("hect@",	"hecta@"); /* 199まで */
	substnum("ylene?@Amin","ylene?min",4,12);
	g("@A", "a");
	g("@O", "o");
    }

/*
 *
 * 縮合環・ヘテロ環における母音脱落
 *
 */
    g("oct",	"~FR|_oct"); /* bis-oct, not biso-ct */
    if (strmatch(self,"iso")) {
	g("trisox",	"tris~FR|_ox"); /* bisoxazole, bisoxy */
	g("bisox",	"bis~FR|_ox");
	g("kisox",	"kis~FR|_ox");
	g("trisoval",	"tris~FR|_oval"); /*iso-valine or bis-ovalene?*/
	g("bisoval",	"bis~FR|_oval");
	g("kisoval",	"kis~FR|_oval");
	g("iso",	"~FR|_iso");
    }
    g("epi",	"~FR|_epi");
    g("epox",	"~FR|_epox");
    g("ind",	"~FR|_ind");
    g("iod",	"~FR|_iod");
    g("imino",	"~FR|_imino");
    g("imidazo","~FR|_imidazo");
    g("ovalen",	"~FR|_ovalen"); /* not o + val-lesamidine */
    g("oxanthren","~FR|_oxanthren");
    g("xanth",	"~FR|_xanth");
    g("oxyacanth","~FR|_QO_xiacanth");
    g("oxy",	"o~FR|_xy"); /* butoxy etc. */
    g("ox",	"~FR|_ox");
    g("undec",	"~FR|_undec");

    g("zinc",	"~FR|_zinc");
    g("zircon",	"~FR|_zircon");
    g("az",	"~FR|_az"); /* aza- azul- */
    g("antimon","~FR|_antimon");
    g("adamant","~FR|_adamant");
    g("annul",	"~FR|_annul");
    g("benzalk","benzal~FR|_k");
    g("alk",	"~FR|_alk");

    if (strmatch(self,"ac")) {
	g("acenaphth",	"~FR|_acenaphth");
	g("acephen",	"~FR|_acephen");
	g("aceanth",	"~FR|_aceanth");
	g("aconit",	"~FR|_aconit");
	g("acrid",	"~FR|_acrid");
	g("acr~FR|_ind","~FR|_acrind");
    }
    if (strmatch(self,"ar")) {
	g("ars",	"~FR|_ars");
	g("aryl",	"~FR|_aryl");
	g("aryn",	"~FR|_aryn");
	g("aren",	"~FR|_aren");
	g("aroyl",	"~FR|_aroyl");
	g("aristol",	"~FR|_aristol");
    }
    if (strmatch(self,"eth")) {
	g("ethan",	"~FR|_ethan");
	g("ethen",	"~FR|_ethen");
	g("ethyn",	"~FR|_ethyn");
	g("ethyl",	"~FR|_ethyl");
    }
    g("androst","~FR|_androst");
    g("anth",	"~FR|_anth");
    g("emet",	"~FR|_emet");
    g("ergo",	"~FR|_ergo");
    g("estr",	"~FR|_estr");

/* 戻さない */
    g("quinque","~NL|_quinKU_"); /* キンク */

#ifndef LITE
    g("abiet",	"~FR|_abiet");
    g("ajmal",	"~FR|_ajmal");
    g("akuamm",	"~FR|_akuamm"),
    g("alsto",	"~FR|_alsto"),
    g("ambros",	"~FR|_ambros");
    g("aspido",	"~FR|_aspido"),
    g("atid",	"~FR|_atid");
    g("atis",	"~FR|_atis");
    g("eburnam","~FR|_eburnam");
    g("eremophil","~FR|_eremophil");
    g("eudesm",	"~FR|_eudesm");
    g("erythr",	"~FR|_erythr");
    g("iboga",	"~FR|_iboga");
    g("ophiobol","~NL|_QO_phiobol");
    g("formosan","fo~FR|_rmosan");
    g("ormosan", "~NL|_QO_rmosan");
    g("olean",	 "~NL|_QO_lean");
    g("urs",	 "~FR|_urs");
    g("yohimb",	 "~FR|_yohimb");
#endif /* LITE */

/*
 * a,oの付加
 */
    g("guanabenz~",	"guanabenzu~");
    g("benz~",		"benzo~");
    g("naphth~",	"naphtho~");
    g("peryl~",		"perylo~");
    g("perylo",		"perilo"); /* -yl で切らない */

    /* HW名が関わらないようcycloで制限（cf.pentazole) */
    if (strmatch(self,"cyclo")) {
	g("cyclo~FR|_oct",  "cyclooct");
	g("cycloprop~",     "cyclopropa~"); /* propoxide */
	g("cyclobut~",      "cyclobuta~");
	g("cyclopent~",     "cyclopenta~");
	g("cyclohex~",      "cyclohexa~");
	g("cyclohept~",     "cyclohepta~");
	g("cyclooct~",      "cycloocta~");
	g("cyclonon~",      "cyclonona~");
	g("cyclodec~",      "cyclodeca~");
	g("cyclo~FR|_alk~", "cycloalka~");
	g("cyclo~FR|_undec~", "cycloundeca~");
	substnum("cyclo?dec~","cyclo?deca~",2,9);
    }
    if (strmatch(self,"cos~")) {
	g("acos~",	"acosa~");
	g("docos~",	"docosa~");
	g("tricos~",	"tricosa~");
	g("icos~",	"icosa~"); /* also eicosa */
    }
    g("acont~",		"aconta~");
    g("hect~",		"hecta~");

/* ついでに、切れ目を利用 */
    if (strmatch(self,"rh")) { /* no-rh, not nor-h */
	glookahead("rhen", VOWEL, "~FR|_rhen");
	glookahead("rhod", VOWEL, "~FR|_rhod");
	g("rhamn",	"~FR|_rhamn");
	g("rhea",	"~FR|_rhea");
#ifndef LITE
	g("rhapont",	"~FR|_rhapont"); /*before apo*/
	g("rhein",	"~FR|_rhein");
	g("rhizo",	"~FR|_rhizo");
	g("rhyncho",	"~FR|_rhyncho");
#endif /* LITE */
    }
    glookahead("r", "hr", "r~FR|_");
    g("apo", "~FR|_apo"); /*aporphine vs porphine */
    g("iss", "is~FR|_s");
    glookahead("isc", "eiy", "is~FR|_c");
    glookahead("ish", VOWEL, "is~FR|_h");

    g("sester","SE_SU_TA_");
    g("heter~FR|_",  "heter"); /* heter(o) */
    g("ter~FR|_ra",  "terra");
    g("ter~FR|_ryl", "terryl");

    g("ter~", "~NL|_TE_RU_~"); /* 環集合・テル, クアテル */
    g("nor~", "~NL|_NO_RU_~"); /* 減炭・ノル */
    g("bis~", "~NL|_BI_SU_~");
    g("tris~","~NL|_TO_RI_SU_~");
    g("kis~", "~NL|_KI_SU_~");

/* 元に戻す */
    g("~FR|_","");

    glookbehind("nl", "esterase~", "~NL|_esterase~");
    glookahead("trans", "aeio", "TO_RA_NN_SU_"); /* trans=aldolase */

/*
 *  例外的字訳
 */
    g("_terpolymer",	"_tahpolymer");
    g("tautomer",	"tohtomer");
    g("plasma~",	"plazma~");

    if (strmatch(self,"gen")) {
	g("collagen",	"collahgen");
	g("cyanogen~",	"cian~");
	g("glycogen",	"glycohgen");
#ifndef LITE
	g("fibrinogen",	"fibrinohgen");
	g("mitogen",	"mitohgen");
	g("phosphagen~","phosphahgen~");
	g("plasmalogen","plazmalohgen");
	g("plasminogen","plasminohgen");
	g("resinogen",	"rezinohgen");
	g("zymogen",	"zymohgen");
#endif /* LITE */
    }
    if (strmatch(self,"ar")) {
	g("stearyl",  "steQA_ryl");
	g("calixaren","calikksu~AR|_aren");
	g("resorcin", "resorcin~AR|_");
	g("yl",		"yl~AR|_");
	g("het",	"het~AR|_");
	g("het~AR|_er",	"heter~AR|_");
	/* a/R_en では amine と結合して _enamine になる */
	glookbehind("aeioy_","aren","a/R_ren");
	glookbehind("aeioy_","aryl","a/R_ryl");
	glookbehind("aeioy_","aryn","arayn");
	g("~AR|_", "");
    }
    if (strmatch(self,"chlor")) {
	g("chlorhex",	"chloruhex");
	g("chloramphenicol","chloramuphenicol");
	g("chloromycetin","chloromaicetin");
    }
    if (strmatch(self,"dur")) {
	g("osiduron", "osidowuron");
	g("dural",	"ZI_XU_ral");     /*duralumin*/
	g("duren",	"ZI_XU_ren");     /*durene*/
	g("durid",	"ZI_XU_rid");     /*duridine*/
	g("durohydro",	"ZI_XU_rohydro"); /*durohydroquinone*/
	g("duroqui",	"ZI_XU_roqui");   /*duroquinone*/
	g("durol",	"ZI_XU_rol");     /*durol*/
	g("duryl",	"ZI_XU_ril");     /*duryl*/
    }
    if (strmatch(self,"glycyr")) {
	g("glycyrrhizic~", "glycyrrhizinic~");
	g("glycyrrhetic~", "glycyrrhetinic~");
	g("glycyrrhizin",  "glytyrurhitin");
	g("glycyrrh",      "glytirurh");
    }
    if (strmatch(self,"hydr")) {
	g("hydrangel",	"hydroangel");
	g("hydracryl",	"hydroacril");
	g("hydratrop",	"hydroatrop");
	g("hydrind",	"hydroind");
	g("hydriod",	"hydroiod");
	g("hydroxylami","hydroxilami");
	g("xanthydr",	"xantohydr");
    }
    if (strmatch(self,"iso")) {
	g("sulfisoxazol","sulfuisokisazol");
	g("isoxazo",	"isooxazo");
	g("erisocalci",	"eruisocalci");
	g("cortiso",	"cortizo");
	g("predniso",	"prednizo");
    }
    if (strmatch(self,"met")) {
	g("methemo",	"metohemo");
	g("methaqualon","metakalon");
	g("metason",	"metazon");
	g("methason",	"metazon");
	g("methacryl",	"metacril");
    }
    if (strmatch(self,"orphin")) {
	g("dynorphin",	"dainorphin");
	g("morphine~",	"moruhiNE_~");
	g("morphin",	"moruhin");
    }
    if (strmatch(self,"oxy")) {
	g("carboxylic~","~NL|_karbonic~");
	g("glyoxyl",	"~NL|_glyoxil"); /* 接合名 */
	g("cycloxygen",	"cyclooxygen");
	g("lipoxygen",	"lipooxygen");
	g("desoxy",	"desuoxy");
    }
    if (strmatch(self,"per")) {
	g("perox",	"~NL|_per~NL|_ox");
#ifndef LITE
	g("tolperison",	"tolperizon");
	g("ypperite~",	"iperite~");
#endif /* LITE */
    }
    if (strmatch(self,"quin")) {
	g("camphorquinon","camforquinon");
	g("quinine~",	"KI_NI_HH_NE_~");
	g("quinic~",	"quinaic~");
	g("quinaldic~",	"quinaldinic~");
    }
    if (strmatch(self,"res")) {
	g("resorcin~",	"rezorcin~");
	g("resorcyl",	"resorcil");
	g("_resin",	"_rezin");
	g("_resol~",	"_rezol~");
	g("_resite~",	"_rezite~");
    }
    if (strmatch(self,"ros")) {
	g("_rosin~", 	"_rozin~");
	g("rosanilin",	"rohzanilin");
    }
    if (strmatch(self,"strychn")) {
	g("strychnine~","strykiniHH_NE_~");
	g("strychnic~",	"strykininic~");
	g("strychn",	"strykin");
    }
    if (strmatch(self,"thre")) {
	g("threuron",	"threwuron");
	g("threul",	"threwul");
	g("indanthren",	"indansren");
    }
    if (strmatch(self,"ubi")) {
	g("ubichrom",	"YU_bichrom");
	g("ubidecar",	"YU_bidecar");
	g("ubihydro", 	"YU_bihydro");
	g("ubiqui", 	"YU_biqui"); /*quinone, quitin*/
    }
    if (strmatch(self,"xyl")) {
	g("hexyl",	"hekisyl"); /* hexyl(ene) etc. ;*/
	g("_xylic~",	"_xililic~");
	g("xyl",	"xil");
    }
    if (strmatch(self,"zym")) {
	g("lysozyme~",	"lyzotihm~");
	g("enzyme~", 	"QE_nzaim~"); /* urenzyme etc. */
	g("isozyme~", 	"QA_isozaim~");
	g("zym",	"tim");
    }

#ifndef LITE
    g("bromfenac",	"bromufenac");
    g("_captan~",	"_KI_XA_ptan~"); /* not mercaptan */
    g("carbetho",	"carboetho"); /* carbethoxy */
    g("carbanion~",	"carboanion~");
    g("cefo",		"ceHU_LO_");
    g("chelat",		"chileht");
    g("dewar~SP|_benz",	"DE_XU_wahbenz");
    g("dewarbenz",	"DE_XU_wahbenz");
    glookbehind("aioy_", "ether", "QE_HH_ther");
    g("fried",		"frihd");
    g("gyrase~",	"jairehsu~");
    g("kaempf", 	"kempf");
    g("litmus~",	"litmas~");
    g("magenta~",	"mazenta~");
    g("mecloqualon",	"meclokalon");
    g("mineralocorticoid", "mineralcorticoid");
    g("naphtha~",	"nafsa~");
    g("prism",		"prizm");
    g("twist",		"tuist");
#endif /* LITE */

    g("allophane~",	"allofen~");
    g("aspartame~",	"aspartehm~");
    g("carrageen",	"caragihn");
    g("crown",		"kraun");
    g("cellophane~",	"cellohan~");
    glookahead("cub","aey~", "KI_XU_b"); /* cubane */
    g("_dopa~",		"_dohpa~"); /* not for levodopa etc. */
    g("duct",		"dact");
    g("eucalypt",	"YU_HH_calypt");
    g("fuller",		"~NL|_fulahr");
    g("gibberellic~",	"jiberellinic~");
    g("gibb",		"jib");
    g("ginkgo",		"ginko");
    g("multi",		"malti");
    g("nitren",		"naitren");
    g("pyrethroid",	"pyresuroid");
    g("silicone~",	"silicohn~");
    g("_soda~",		"_sohda~");
    g("thalidomid",	"salidomaid");

    if (strmatch(self,"in")) {
	g("ovalbumin",	"ovoalbumin");
	g("albumin",	"QA_lbumin"); /* con-, lact-, etc. */
	g("angiotensin","anziotensin");
	g("blasticidin","blastosaidin");
	g("calmodulin",	"calmojulin");
	g("casein", 	"kazein");
	g("colchicin",	"kolhitin");
	g("cyclin",	"saiklin");
	g("flagellin",	"flajelin");
	g("gelatin",	"zelatin");
	g("margarine~",	"mahgarine~");
	g("niacin~",	"naiacin~"); /* not for azoniacinnoline */
	g("niacinamid",	"naiacinamid");
	g("niacinat",	"naiacinat");
	g("rhodanin",	"rohdanin");
#ifndef LITE
	g("accelerin",	"akcelerin");
	g("acridarsin",	"acridoarsin");
	g("agglutinin",	"aglutinin");
	g("amphotericin","amufotericin");
	g("ciguatoxin",	"cigatoxin");
	g("cycasin",	"saicasin");
	g("diazinon~",	"daiazinon~");
	g("endothelin",	"endoselin");
	g("idoxuridin",	"idoksuuridin");
	g("interferon",	"intahferon");
	g("interleukin","intahleukin");
	g("nisin~",	"naisin~");
	g("nystatin",	"naistatin");
	g("oxethazain",	"oxesazein");
	g("physostigmin","phizostigmin");
	g("turpentine~","terebin~");
	g("vaccine~",	"waktine~");
	g("vaseline~",	"waseline~");
#endif /* LITE */
    }

    if (strmatch(self,"ol")) {
	g("macrolide~",	"macrolaido~");
	g("alcohol",	"alcol");
	g("cresol",	"crezol");
	g("pipecolic~",	"pipecolinic~");
	g("pipecol",	"pipeKO_l");
	g("propiol",	"propiQO_l");
	g("tetrol",	"tetRO_l");
#ifndef LITE
	g("gossypol",	"gosipol");
	g("helvol",	"helBO_l");
	g("ichthammol",	"ictamol");
	g("oxprenolol",	"okusuprenolol");
#endif /* LITE */
    }

    if (strmatch(self,"undum~")) {
	g("corundum~",    "corandamu~");
	g("alundum~",     "alandamu~");
	g("carborundum~", "cahborandamu~");
    }

    if (strmatch(self,"yl")) {
	g("cylindr",	"cilindr");
	g("neophyl",	"neofyl");
	g("tryptophyl",	"tryptofyl");
	g("beryll",	"beril");
	g("phyll",	"fil");
	g("scyll",	"scil");
	g("phenylephrin","phenilephrin");

	g("carvacryl",	"carvakryl");
	g("acryl",	"~NL|_acril"); /* 接合名 */
	g("tricarballyl","tricarballil");
	g("capryl",	"kapril");
	g("salicyl",	"saRI_til");
	g("piperonyl",	"piperonil");
	g("prehnityl",	"prehnitil");
#ifndef LITE
	g("moxisylyt",	"moxisiRI_t");
#endif /* LITE */

	if (strmatch(self,"ylo")) {
	    g("adenylo",	"adenilo");
	    g("amylopectin",	"amilopectin");
	    g("amylose",	"amilose");
#ifndef LITE
	    g("ascarylos",	"ascarilos");
	    g("chylomicron",	"chilomicron");
	    g("stylopin",	"stilopin");
	    g("trachylob",	"trachilob");
#endif /* LITE */
	    g("_nylon~",	"_nailon~");
	}
    }

/*
 * アミド酸など
 */
    if (strmatch(self,"am") || strmatch(self,"anil")) {
	g("adipa",	"adip/C_a");
	g("azelaa",	"azela/C_a");
	g("mala",	"mal/C_a");
	g("malea",	"male/C_a");
	g("oxala",	"oxal/C_a");
	g("phthala",	"phthal/C_a");
	g("pimela",	"pimel/C_a");
	g("sebaca",	"sebac/C_a");
	g("subera",	"suber/C_a");
	g("sulfena",	"sulfen/C_a");
	g("truxilla",	"truxill/C_a");
	g("ina",	"in/C_a");
	g("ona",	"on/C_a");
	g("ara",	"ar/C_a");

	g("ethin/C_a",	"ethina");

	if (strmatch(self,"_am")) {
	    g("_amic~",   "_QA_midoic~");
	    g("_amoyl",   "_QA_moyl");
	    g("_amate",   "_QA_mate");
	    g("_amato",   "_QA_mato");
	}
	if (strmatch(self,"_anil")) {
	    g("_anilic~", "_QA_nilidoic~");
	    g("_anilat",  "_QA_nilat");
	    g("_anilo",   "_QA_nilo");
	    g("_anil~",   "_QA_nil~");
	}
	g("/C_", "");
    }
    if (strmatch(self,"amic~")) {
	g("carbamic~",  "carbaminic~");
	g("glutamic~",	"glutaminic~");
	g("hydroxamic~","hydrokisamic~");
	g("muramic~",	"muraminic~");
	g("oxamic~",    "oxamidic~");
	g("picramic~",	"picraminic~");
	g("sulfamic~",	"sulfaminic~");
    }
    if (strmatch(self,"anilic~")) {
	g("carbanilic~","carbanilidic~");
	g("oxanilic~",  "oxanilidic~");
    }

/*
 * 酸語幹の字訳例外
 */
    g("chaulmoogric~",	"TI_XO_HH_RU_MU_HH_GU_RA_ic~");
    g("chaulmoogr",	"TI_XO_HH_RU_MU_HH_gr");
    g("koji",		"kouji");
    g("oxalacet",	"oxaloacet");
    g("vaccen",		"vakcen");
#ifndef LITE
    g("lysergic~",	"lyzerginic~");
    g("lyserg",		"lyzerg");
    g("nalidix",	"nalidiks");
    g("iotrox",		"iotroks");
    g("camsyl",		"cansyl");
    g("camsil",		"cansil");
#endif /* LITE */

    /* 接合名 */
    g("malon", "~NL|_malon");
    g("succin","~NL|_sukcin");

/*
 * 酸の字訳例外
 */
    if (strmatch(self,"ic~")) {
	g("arachic~",	"QA_rakinic~");
	g("azelaic~",	"QA_zelainic~");
	g("carbazic~",	"carbazinic~");
	g("chorismic~",	"chorisminic~");
	g("humic~",	"huminic~");
	g("pyridoxic~",	"pyridoxinic~");
	g("pyruvic~",	"pyruvinic~");
	g("toluic~",	"toluilic~");
	g("xanthic~",	"xanthogenic~");

	if (strmatch(self,"nic~")) {
	    g("kainic~",	"kaininic~");
	    g("styphnic~",	"stifninic~");
	    g("tannic~",	"tanninic~");
	    g("usnic~",		"usninic~");
	}
	if (strmatch(self,"bic~")) {
	    g("ascorbic~",	"ascorbinic~");
	    g("erythorbic~",	"erythorbinic~");
	    g("sorbic~",	"sorbinic~");
	    g("yohimbic~",	"yohimbinic~");
	}
	if (strmatch(self,"cic~")) {
	    g("erucic~",	"erucaic~");
	    g("leucic~",	"leucinic~");
	    g("punicic~",	"punicaic~");
	    g("sebacic~",	"sebacinic~");
	}
	if (strmatch(self,"dic~")) {
	    g("acridic~",	"acridinic~");
	    g("arachidic~",	"arakidinic~");
	    g("brassidic~",	"brassidinic~");
	    g("ricinelaidic~",	"ricinelaidinic~");
	    g("elaidic~",	"elaidinic~");
	    g("fusidic~",	"fusidinic~");
	    g("phosphatidic~",	"phosphatidinic~");
#ifndef LITE
	    g("geddic~",	"gedaic~");
	    g("gheddic~",	"ghedaic~");
	    g("petroselidic~",	"petroselidinic~");
#endif /* LITE */
	}
	if (strmatch(self,"eic~")) {
	    g("caffeic~",	"caffeHH_ic~");
	    g("croceic~",	"croceinic~");
	    g("cysteic~",	"cysteinic~");
	    g("maleic~",	"maleinic~");
	    g("linoleic~",	"linohlic~");
	    g("ricinoleic~",	"ricinohlic~");
	    g("oleic~", 	"oleinic~");
	}
	if (strmatch(self,"lic~")) {
	    g("angelic~",	"angelicaic~");
	    g("ferulic~",	"ferulaic~");
	    g("petroselic~",	"petroselinic~");
	    g("pimelic~",	"pimelinic~");
	    g("tiglic~",	"tiglinic~");
	    g("vanillic~",	"vanillinic~");
	}
	if (strmatch(self,"pic~")) {
	    g("adipic~",	"QA_dipinic~");
	    g("chromotropic~",	"kromoTO_ropic~");
	    g("hydnocarpic~",	"hydnocarpusuic~");
	    g("sinapic~",	"sinapinic~");
	    g("tropic~",	"tropaic~");
	}
	if (strmatch(self,"ric~")) {
	    g("capric~",	"caprinic~");
	    g("glyceric~",	"glycerinic~");
	    g("hygric~",	"hygrinic~");
	    g("lignoceric~",	"lignocerinic~");
	    g("margaric~",	"margarinic~");
	    g("picric~",	"picrinic~");
	    g("stearic~",	"stearinic~");
	    g("suberic~",	"suberinic~");
	    g("veratric~",	"veratrumic~");
	}
	if (strmatch(self,"sic~")) {
	    g("abscisic~",	"absisinic~");
	    g("gentisic~",	"gentizinic~");
	    g("melissic~",	"melissinic~");
	    g("trimesic~",	"trimesinic~");
	}
	if (strmatch(self,"tic~")) {
	    g("abietic~",	"abietinic~");
	    g("aconitic~",	"aconittic~");
	    g("aspartic~",	"asparaginic~");
	    g("ceroplastic~",	"ceroplastinic~");
	    g("cerotic~",	"cerotinic~");
	    g("cresotic~",	"cresotinic~");
	    g("isatic~",	"isatinic~");
	    g("myristic~",	"myristinic~");
	    g("nipecotic~",	"nipecotinic~");
	    g("palmitic~",	"palmitinic~");
	    g("pectic~",	"pectinic~");
	    g("phytic~",	"phytinic~");
	    g("stipitatic~",	"stipitatinic~");
#ifndef LITE
	    g("sapietic~",	"sapietinic~");
	    g("traumatic~",	"traumatinic~");
	    g("trimesitic~",	"trimesitinic~");
#endif /* LITE */
	}
	if (strmatch(self,"oic~")) {
	    g("allantoic~",	"alantoinic~");
	    g("caproic~",	"capronic~");
	    g("hydantoic~",	"hydantoinic~");
	    g("naphthoic~",	"naphthoQE_ic~");
	    g("pantoic~",	"pantoinic~");
	    g("pteroic~",	"pteroinic~");
	    g("retinoic~",	"retinoinic~");
#ifndef LITE
	    g("canrenoic~",	"canreno~NL|_ic~");
	    g("iopanoic~",	"iopano~NL|_ic~");
#endif /* LITE */
	    g("thioic~",	"thio~NL|_ic~");
	    g("selenoic~",	"seleno~NL|_ic~");
	    g("telluroic~",	"telluro~NL|_ic~");
	    g("ethenoic~",	"ethenic~");
	    g("thenoic~",	"theNO_ic~"); /* thiophenecarboxylic acid */

	    g("noic~",    "nic~"); /*alkanoic acids*/
	    g("dioic~",   "$2_ic~");
	    g("trioic~",  "$3_ic~");
	    g("tetroic~", "$4_ic~");
	    g("pentoic~", "$5_ic~");
	    g("|_oic~",	"|_ic~");
	}
    }

/*
 * "酸" の位置の調整（-icの後の文字まで動かす）
 *  acetic-S acid 酢-S酸
 *  bis[acetic-[18O] [2H]acid]
 */
    glookbehind("cosy", "~HY|_acid~", "~SP|_acid~"); /*ic,ous,oxo,oxy*/

    moveacid(); /*この中で acid → $SAN_ */

    g("acid~", "$SAN_~");

/* アミンは骨格の前だけ */
/* n, et, ol, yl, il の後 */
    if (strmatch(self,"amin")) {
	g("amin",	"@amin");
	g("_en@a",	"_ena");
	g("_yn@a",	"_yna");
	g("dop@a",	"dohpa");
	g("hyoscy@a",	"hiyostia");
	g("methen@a",	"methena");
	g("osedi@a",	"ose~NL|_dia"); /* lactosediamine */
	g("phet@a",	"pheta");
	g("rhod@a",	"rohda");
	g("scopol@a",	"scopola");
	g("thiosin@a",	"thiosina");
#ifndef LITE
	g("buphan@a",	"buphana");
	g("cinchon@a",	"cinchona");
	g("con@a",	"cona");
	g("crin@a",	"crina");
	g("dimorphol@a","dimorphola");
	g("emet@a",	"emeta");
	g("guan@a",	"guana");
	g("lefet@am",	"lefetam");
	g("nicotian@a",	"nicotiana");
	g("prol@a",	"prola");
	g("quin@a",	"quina");
	g("surin@a",	"surina");
#endif /* LITE */
	g("phosphetamin", "phosphet@amin");
    }
    g("imin",	"@imin");
    if (chrmatch(self,'@')) {
	g("ket@",    "ket");     /* ketamine, ketimine */
	g("nitr@",   "nitro");
	g("nitros@", "nitroso");
	g("thion@am","thionam");
	glookbehind("aeioy", "n@", "n~NL|_");
	g("ol@",     "ol~NL|_");  /* phospholamine, catecholamine */
	g("one@",    "one~NL|_"); /* quinoneimine */
	g("et@",     "et~NL|_");
	g("yl@",     "yl~NL|_");
	g("il@",     "il~NL|_"); /* sulfilimine, nitrilimine */
	g("@", ""); /* @amin and @imin */
    }

/* アジド、類型名を考慮 */
    if (strmatch(self,"azid")) {
	glookbehind("eio", "nazid", "nQA_zid");
	g("phosphorazid", "phosphorQA_zid");
	g("amidazid",     "amidQA_zid");
    }

/* アミド・イミド */
    g("anilid",	"@anilid");
    g("anisid",	"@anisid");
    if (strmatch(self,"mid")) {
	g("amid", "@amid");
	g("imid", "@imid");

	if (strmatch(self,"@am")) {
	    glookahead("@amid", "bcdfghjklmnpqrstuvwxz", "amid"); /*aeioy*/
	    glookbehind("io", "b@amid", "bamid"); /* cobamide and analogs */
	    glookbehind("aeioyl_", "cer@amid", "ceramid");
	    g("glyceramid",   "glycer@amid");
	    g("lignoceramid", "lignocer@amid");
#ifndef LITE
	    g("acetazol@am", "acetazolam");
	    g("_ar@amid~",   "_aramid~");
	    g("chlorprop@am","chlorpropam");
	    g("cefpir@am",   "cefpiram");
	    g("cobam@am",    "cobamam");
	    g("diclofen@am", "diclofenam");
	    g("disopyr@am",  "disopyram");
	    g("ethenz@am",   "ethenzam");
	    g("ethion@am",   "ethionam");
	    g("glibencl@am", "glibenclam");
	    g("mur@am",      "muram");  /* muramidase */
	    g("meth@am",     "metham"); /* methamidophos */
	    g("metoclopr@am","metoclopram");
	    g("prothion@am", "prothionam");
	    g("tolaz@am",    "tolazam");
	    g("tolbut@am",   "tolbutam");
	    g("tiar@am",     "tiaram");
	    g("tropic@am",   "tropicam");
	    g("valles@am",   "vallesam"); /*vallesamidine*/
	    g("zonis@am",    "zonisam");
#endif /* LITE */
	}
	if (strmatch(self,"@im")) {
	    glookahead("@imid", "bcdfghjklmnpqrstuvwxz", "imid"); /*aeioy*/
	    g("per@imidin",  "perimidin");
	    g("pyr@imid",    "pyrimid"); /*pyrimido-*/
#ifndef LITE
	    g("ethosux@im",  "ethosukusim");
	    g("gluteth@im",  "glutethim");
	    g("pr@imidon",   "primidon");
#endif /* LITE */
	}
    }
    if (chrmatch(self,'@')) {
	g("mucochlor@", "mucoculor@");
	g("mucobrom@",  "mucoburom@");
	g("fluor@",  "fluor");
	g("chlor@",  "chlor");
	g("brom@",   "brom");
	g("iod@",    "iod");
	g("nitr@",   "nitr");
	g("nitros@", "nitros");
	g("carb@",   "carb");
	g("cyan@",   "cyan");
	g("phosph@", "phosph");
	g("sulf@",   "sulf");
	g("ox@",     "ox");
	g("ol@",     "ol~NL|_@");
	g("anthr@",  "anthr");
	g("@a", "QA_");
	g("@i", "QI_");
    } /* @amid, @imid etc. */

/* アルデヒド・オキシム */
    if (strmatch(self,"ald")) {
	g("carbald",	"carbaRU_d");
	g("carboxald",	"carboxaRU_d");
	g("carbothiald",	"carbothioald");
	g("carboselenald",	"carboselenoald");
	g("carbotellurald",	"carbotelluroald");
	g("metaldehyd",	"metaaldehyd");
	g("paraldehyd",	"paraaldehyd");
	g("olald",	"ol~NL|_QA_ld");
	g("aldehyd",	"QA_ldehyd");
	g("aldoxim",	"QA_ldoxim");
    }
    g("onoxim",		"on~NL|_oxim"); /* quinonoxime */

/* 炭素鎖（接合名）*/
    g("phenacet","pheNA_cet");
    g("acacet",	"aKA_cet");
    g("acet",	"~NL|_QA_cet");
    g("alanin",	"~NL|_QA_lanin");
    g("pyruv", 	"~NL|_pyruv");
    g("glyc",	"~NL|_glyc");
    g("lact",	"~NL|_lact"); /* lactam, indolelactate etc. */
    g("undec",	"~NL|_QU_ndec");

    if (strmatch(self,"eth")) {
	g("phenethy",	"HU_LE_NE_thy");
	g("fenethy",	"HU_LE_NE_thy");
	g("ethan",	"eth@an");
	g("ethen",	"eth@en");
	g("ethyn",	"eth@yn");
	g("ethyl",	"eth@yl");
	g("meth@",	"~NL|_meth");
	glookbehind(ECONS, "eeth@", "e~NL|_eth");
	glookbehind(VOWEL, "neth@", "n~NL|_eth");
	glookbehind(VOWEL, "leth@", "l~NL|_eth");
	g("@","");
    }

    if (strmatch(self,"icos")) {
	g("henicos",	"~NL|_henQI_cos");
	g("heneicos",	"~NL|_henQE_QI_cos");
	g("eeicos",	"e~NL|_QE_QI_cos");
	g("tricos",	"~NL|_TO_RI_cos");
	g("furaneicos",	"furan~NL|_QE_QI_cos");
	g("pyraneicos",	"pyran~NL|_QE_QI_cos");

	glookbehind(ECONS, "eicos","e~NL|_QI_cos");
	g("eicos","~NL|_QE_QI_cos");

	glookbehind("oy", "licos","l~NL|_QI_cos");
	g("nicos","n~NL|_QI_cos");
	g("isicos","is~NL|_QI_cos"); /* bis, tris, tetrakis */
    }

    if (strmatch(self,"iso")) {
	g("isocyan",	"~NL|_isocian");
	g("isothio",	"~NL|_isothio");
	g("isoseleno",	"~NL|_isoseleno");
	g("isotelluro",	"~NL|_isotelluro");
	g("isomerase",	"~NL|_isomerase");
    }
    if (strmatch(self,"nor")) {
	g("noradren",	"nor~NL|_adren");
	g("noracyl",	"nor~NL|_acyl");
	g("norepinephr","nor~NL|_epinephr");
	g("norephedr",	"nor~NL|_ephedr");
	g("norethi",	"nor~NL|_ethi");
    }

/*
 * 黙字のeの直後の子音
 */
    g("carb","~NL|_carb");
    if (strmatch(self,"hydr")) {
	g("didehydr",	"diDE_hidr");
	g("adehydr",	"aDE_hidr"); /*tetradehydro etc.*/
	g("odehydr",	"oDE_hidr"); /*codehydrogenase etc.*/
	glookbehind("cpt", "hydr","hidr");
	g("hydr",	"~NL|_hydr");
    }
    g("nitril", "~NL|_nitril");
    g("quinon", "~NL|_quinon");
    g("phosph", "~NL|_phosph"); /*ars は未対処*/
    g("silicon","~NL|_silicon");
    g("spiro",  "~NL|_spiro"); /* cyclooctanespirocyclopentane */
    g("sulf",	"~NL|_sulf");
    g("selen",	"~NL|_selen");
    g("selon",	"~NL|_selon");
    g("tellur",	"~NL|_tellur");
    g("tellon",	"~NL|_tellon");

    if (strmatch(self,"bor")) {
	g("boran",	"~NL|_boran");
	g("borin",	"~NL|_borin");
	g("boron",	"~NL|_boron");
	g("borylia",	"~NL|_borilia");
    }
    if (strmatch(self,"thi")) {
	g("isethion",	"isetion"); /* e-thio の e が黙字にならぬよう */
	g("|_methiodid","|_ME_TO_iodid");
	g("|_ethiodid",	"|_QE_TO_iodid");
	g("methion",	"ME_tion");/* methion-ine|ic */
	g("ylethion",	"ylQE_tion");
	glookbehind(ECONS, "ethion","~NL|_thion");
	g("ethion", "QE_tion");  /* ethion-ine|ic */
	g("methi",  "ME_TI_");
	glookahead("thi", "aoy", "~NL|_thi");
    }

     /* ヨード */
    if (strmatch(self,"iod")) {
	g("iodid", "YO_HH_ZI_d"); /*挿入辞*/
	glookbehind("aeioy_","iod","YO_HH_d");
	g("yliod", "ylYO_HH_d");
	g("period","perYO_HH_d");
    }

    g("_ammono","_QA_NN_MO_no");
    g("mono",	"~NL|_mono");
    g("bis",	"~NL|_bis");
    g("tris",	"~NL|_tris");

    if (strmatch(self,"non")) {
	glookbehind(ECONS, "enona", "e~NL|_nona");
	glookbehind(ECONS, "enonyl","e~NL|_nonyl");
	g("sele~NL|_non",  "selenon");
	g("~NL|_nonate~",  "nonate~");
	g("~NL|_nonato",   "nonato");
	g("~NL|_nonaphth", "nonaphth");
    }

    if (strmatch(self,"tetr")) {
	g("etetrinon", "ete~NL|_trinon");
	g("tetrin",  "TE_TO_rin");
	g("tetritol","TE_TO_ritol");
	g("tetrityl","TE_TO_rityl");
	g("tetrite~","TE_TO_rite~");
	glookbehind(ECONS, "etetr", "e~NL|_tetr");
    }

    glookbehind(ECONS, "e", "e@");
    if (chrmatch(self,'@')) {
	g("@hen", "~NL|_hen");
	g("@do",  "~NL|_do");
	g("@di",  "~NL|_di");
	g("@tri", "~NL|_tri");
	g("@prop","~NL|_prop");
	g("@but", "~NL|_but");
	g("@pent","~NL|_pent");
	g("@hex", "~NL|_hex");
	g("@hept","~NL|_hept");
	g("@oct", "~NL|_oct");
	g("@hect","~NL|_hect");
	g("@alk", "~NL|_alk");
	g("@","");
    }
    glookbehind(ECONS, "edec", "e~NL|_dec");
    glookbehind(VOWEL, "noct", "n~NL|_oct");
    glookbehind(VOWEL, "nalk", "n~NL|_alk");

    g("benz",	"~NL|_benz");
    g("phthalein","~NL|_phthalein");
    g("camphor~","$_shounou~"); /* ショウノウスルホン酸 */

/*
 * 語末
 */
    g("$", "~KK|_$");
    g("~KK|_$SAN_", "$SAN_");

    if (strmatch(self,"ate~")) {
	g("lyate~",	"lyehto~");
	g("phenidate~",	"phenidehto~");
    }
    if (strmatch(self,"mycin")) {
	g("aureomycin",	"ohreomaicin");
	g("thromycin",	"sromaicin"); /* erythro etc. */
	g("mitomycin",	"maitomaicin");
	g("puromycin",	"PI_XU_romaicin");
	g("mycin~",	"maicin~");
    }
    if (strmatch(self,"micin")) {
	g("elemicin~",	"elemisin~");
	g("micin~",	"maicin~");
    }
    if (strmatch(self,"yn")) {
	g("benzyn",	"benzain");
	g("pyridyn",	"pyridain");
	g("thiazyn",	"thiazain");
    }

    if (strmatch(self,"al~")) {
#ifndef LITE
	g("anisal~",	"anisaRU_~");
	g("benzal~",	"benzaRU_~");
	g("cinnamal~",	"cinnamaRU_~");
	g("cumal~",	"cumaRU_~");
	g("phthal~",	"phthaRU_~");
	g("phthalal~",	"phthalaRU_~");
	g("saRI_tilal~","saRI_tilaRU_~");
	g("vanillal~",	"vanillaRU_~");
	g("veratral~",	"veratraRU_~");
#endif /* LITE */
	g("crystal~",	"crystaRU_~");
	g("radical~",	"radicaRU_~");
	g("al~", "ahl~");
    }
    if (strmatch(self,"t~")) {
	g("_unit~",	"_yunit~");
	g("_subunit~",	"_sabuyunit~");
	g("quat~",	"quatto~");
	g("stat~",	"statto~");
	glookbehind("ai", "uret~", "uretto~");
	g("it~", "itto~");
	g("ot~", "ohto~");
	g("yt~", "itto~");
    }
    g("pheneyl","phen~NL|_yl"); /*thiopheneyl etc.*/
    g("pheneol","phen~NL|_ol"); /*thiopheneol etc.*/
    g("glycerol~", "glycerin~");
    glookahead("methylol", "~abcdfghjklmnopqrstuvwxyz",
	"ME_TI_RO_HH_RU_"); /* methylol, avoid "ole", or "oli" */

    g("ol$SAN_", "ohl$SAN_");

    if (strmatch(self,"sol~")) {
	g("_sol~",       "_zolu~");
	g("_hydrosol~",  "_hydrozolu~");
	g("_organosol~", "_organozolu~");
	g("_plastisol~", "_plastizolu~");
    }
    g("ol~",  "ohl~");
    g("oll~", "ohl~");

    glookahead("calix", "bcdfghjklmnpqrstuvwxz~", "calikkusu"); /*aeioy*/
    if (strmatch(self,"ex~")) {
	g("latex~", "latekkusu~");
	g("plex~",  "plekkusu~");
	g("orex~",  "orekusu~");
    }
    if (strmatch(self,"os")) {
	g("os~FN|_","osu~FN|_");
	g("os~SP|_","osu~SP|_");
	g("os~",  "ohsu~");
	g("ose~", "ohsu~");
    }
    g("dimer~", "daimah~");
    g("mer~",   "mah~");
#ifndef LITE
    g("eth~",   "eSU_~");
    g("fur~",   "fuhr~");
    g("ism~",   "izm~");
#endif /* LITE */

    if (strmatch(self,"e~")) {
	g("ole~", "ohl~");
	g("ase~", "ahZE_~");
	g("ate~", "ahto~");
	g("ite~", "itto~");
	g("ote~", "ohto~");
	g("yte~", "itto~");
	g("cycle~", "SA_icle~");
#ifndef LITE
	g("nce~",   "NN_SU_~"); /* ance, ence */
	g("some~",  "SO_HH_MU_~");
#endif /* LITE */
	g("ade~",	"ad/E_~"); /* tetrade- */
	g("|_ne~",	"|_n/E_~");
	g("|_de~",	"|_d/E_~"); /* de-N-methyl */
	g("|_dide~",	"|_did/E_~"); /* -dide- */
	g("|_tride~",	"|_trid/E_~"); /* -tride- */
	g("pre~KK|_$",	"pr/E_$");   /* "preprotein */
	g("e~", "~"); /* 語尾の e の脱落 */
    }
    g("e$SAN_", "/E_$SAN_"); /* "-eic acid" */
    g("/E_","e");
    g("eazo","QA_zo");
/*
 * 基名・後ろの母音とつなげない
 */
    g("inidene","inideNN_");
    g("inidyne","inidyNN_");
    g("ilidene","ilideNN_"); /*XXX*/
    g("ilidyne","ilidyNN_"); /*XXX*/

    if (strmatch(self,"yl")) {
	g("ylidene","~YL|_ilideNN_");
	g("ylidyne","~YL|_ilidyNN_");
	g("yliden", "~YL|_iliden");
	g("ylidyn", "~YL|_ilidyn");
	g("ylene",  "~YL|_ileNN_"); /* maybe methylene, perylene, etc. */
	g("ylen",   "~YL|_ilen");
	g("ylium",  "~YL|_ilium");
	g("ylid~",  "~YL|_ilid~");
	g("ylidar", "ylQI_dar"); /* idaric acid */
	g("ylidur", "ylQI_dur"); /* iduronic acid */
	g("ylan~",  "ilan~");
	g("ylin~",  "ilin~");
	g("ylio~",  "iliQO_~");
	g("yllin~", "illin~");
	g("ylah",   "ilah"); /* -ylal, -ylate, -ylase */
	g("ylato",  "ilato");
	g("anylia", "anilia");

	/* ylo接頭辞の処理。まだかなり不完全 */
	if (strmatch(self,"ylo")) {
	    g("ylo~",   "ilo~");
	    g("yloin~", "iloin~");
	    g("ylon~",  "ilon~");

	    g("yloyl", "iloyl");
	    g("yloleuc", "iRO_leuc");
	    g("yloct",	 "iRU_oct");
	    glookahead("ylol", "ei",   "iRU_ol");
	    glookahead("ylor", "cmnt", "iRU_or");
	    g("ylosazon",  "iRU_osazon");
	    g("yloxanthr", "iRU_oxanthr");
	    g("yloxanth",  "QI_RO_~NL|_xanth");
	    g("yloxil~",   "iRU_oxil~");
	    g("yloxilium", "iRU_oxilium");
	    g("yloxil",    "QI_RO_xil"); /* xyl- */
	    glookahead("ylox", "aeioy","iRU_ox");

	    /*できるだけ少なく*/
	    g("ylylo", "ylQI_RO_~NL|_");
	    glookbehind("aeioy_", "ylo", "QI_RO_~NL|_");
	    g("amylo", "amilo~NL|_");
	}

	g("ylil",      "ilil");
	g("ylyl",      "ilyl");
	g("yl~YL|_il", "ilil");
	g("~YL|_", "");
	g("yl","iRU_");
    }
    g("a/R_ri", "aRI_HH_");
    g("a/R_re", "aRE_HH_");

    g("ammine","QA_NN_MI_NN_");
    g("~KK|_", "");

/*
 * 等価字
 */
    g("exci","ekisi"); /*XXX*/
    g("dz", "z"); /*XXX*/
    g("tsu","tu"); /*XXX*/

    g("ch","k");
    g("ff","f");
    g("pf","p");
    g("kh","k");  /*XXX*/
    g("gh","g");
    g("ll","l");
    g("pph","f");
    g("ph","f");

    g("rr","r"); /* also rrh */
    g("rh","r");

    glookahead("m", "bpmf", "n");
    glookahead("sc", "eiy", "s");

    g("th","t");
    g("v","b");
    g("xs","kis"); /*XXX*/
    g("x","kis");
    g("neuro","NI_XU_HH_RO_");
    g("eu","oi");

 /* ae, oe, ouは個別に対応する */
    glookahead("coum", "aeio", "KU_m"); /* クマリンなど */
    g("bourbon","BU_RU_bon");
    g("ouaba",	"QU_QA_ba"); /* ouaba-in, -genin */
 /* g("ae","e"); */
 /* g("oe","e"); */
 /* g("ou","u"); */

 /* yの判定：母音に挟まれた Y は子音 */
    glookbehind("aiueoy_", "y", "/Y_"); /* 母音・記号の後の y は子音候補 */
    g("y","i");  /* それ以外は i */
    glookahead("/Y_", "aiueo", "y"); /* 母音が続けばヤ行 */
    g("/Y_","i"); /* それ以外は i */

/*
 * カナ
 */
    g("bb","TT_b");
    glookahead("c", "ckq", "TT_");
    g("dd","TT_d");
    g("gg","TT_g");
    g("kk","TT_k");
    g("pp","TT_p");
    g("ss","TT_s");
    g("tt","TT_t");
    g("zz","TT_z");

    g("qua","KU_QA_");
    g("qui","KI_");
    g("quu","KU_"); /*XXX*/
    g("que","KU_LE_");
    g("quo","KU_LO_");
    g("q",  "k"); /*XXX*/

    g("sha","SI_XA_");
    g("shi","SI_");
    g("shu","SI_XU_");
    g("she","SI_LE_");
    g("sho","SI_XO_");
    g("sh", "SI_XU_");

    g("ba","BA_");
    g("bi","BI_");
    g("bu","BU_");
    g("be","BE_");
    g("bo","BO_");
    g("ca","KA_");
    g("ci","SI_");
    g("cu","KU_");
    g("ce","SE_");
    g("co","KO_");
    g("da","DA_");
    g("di","ZI_");
    g("du","ZU_");
    g("de","DE_");
    g("do","DO_");
    g("fa","HU_LA_");
    g("fi","HU_LI_");
    g("fu","HU_");
    g("fe","HU_LE_");
    g("fo","HO_");
    g("ga","GA_");
    g("gi","GI_");
    g("gu","GU_");
    g("ge","GE_");
    g("go","GO_");
    g("ha","HA_");
    g("hi","HI_");
    g("hu","HU_");
    g("he","HE_");
    g("ho","HO_");
    g("ja","ZI_XA_");
    g("ji","ZI_");
    g("ju","ZI_XU_");
    g("je","ZI_LE_");
    g("jo","ZI_XO_");
    g("ka","KA_");
    g("ki","KI_");
    g("ku","KU_");
    g("ke","KE_");
    g("ko","KO_");
    g("la","RA_");
    g("li","RI_");
    g("lu","RU_");
    g("le","RE_");
    g("lo","RO_");
    g("ma","MA_");
    g("mi","MI_");
    g("mu","MU_");
    g("me","ME_");
    g("mo","MO_");
    g("na","NA_");
    g("ni","NI_");
    g("nu","NU_");
    g("ne","NE_");
    g("no","NO_");
    g("pa","PA_");
    g("pi","PI_");
    g("pu","PU_");
    g("pe","PE_");
    g("po","PO_");
    g("ra","RA_");
    g("ri","RI_");
    g("ru","RU_");
    g("re","RE_");
    g("ro","RO_");
    g("sa","SA_");
    g("si","SI_");
    g("su","SU_");
    g("se","SE_");
    g("so","SO_");
    g("ta","TA_");
    g("ti","TI_");
    g("tu","TU_");
    g("te","TE_");
    g("to","TO_");
    g("wa","WA_");
    g("wi","QU_LI_");
    g("wu","QU_");
    g("we","QU_LE_");
    g("wo","QU_LO_");
    g("ya","YA_");
    g("yi","QI_");
    g("yu","YU_");
    g("ye","QI_QE_");
    g("yo","YO_");
    g("za","ZA_");
    g("zi","ZI_");
    g("zu","ZU_");
    g("ze","ZE_");
    g("zo","ZO_");
    g("a", "QA_");
    g("i", "QI_");
    g("u", "QU_");
    g("e", "QE_");
    g("o", "QO_");
    g("b", "BU_");
    g("c", "KU_");
    g("d", "DO_");
    g("f", "HU_");
    g("g", "GU_");
    g("h", "HH_");
    g("j", "ZI_XU_");
    g("k", "KU_");
    g("l", "RU_");
    g("m", "MU_");
    g("nn","NN_"); /*XXX*/
    g("n", "NN_");
    g("p", "PU_");
    g("r", "RU_");
    g("s", "SU_");
    g("t", "TO_");
    g("w", "QU_");
    g("z", "ZU_");

/*
 * 日本文字に変換して出力
 */
    cvtjapan();
    return self;
}



#ifndef JS

void putmsg(char** p)
{
    while (*p)
	puts(*p++);
    return;
}

void chgopt(char* p)
{
    inv = inv2 = alt = alt2 = 0; /* all clear */

    if (chrmatch(p,'a'))
	alt = 1;
    if (chrmatch(p,'A'))
	alt = alt2 = 1;
    if (chrmatch(p,'i'))
	inv = 1;
    if (chrmatch(p,'I'))
	inv2 = 1;
    return;
}

/*
 * Cにおけるmain関数。
 * JSではフォームのオブジェクトを使用するので不要。
 */
int main(int argc, char * argv[])
{
    int block = 1, maxbuff = 1;
    char buff[BUFSIZE], *line, *request;
    size_t buflen;

    /* メモリの確保 */
    if ((line = malloc(BUFSIZE)) == NULL) {
	fprintf(stderr, "Error! on malloc: line."); exit(1);
    }
    if ((self = malloc(STRSIZE)) == NULL) {
	fprintf(stderr, "Error! on malloc: self."); exit(1);
    }
    if ((dest = malloc(STRSIZE)) == NULL) {
	fprintf(stderr, "Error! on malloc: dest."); exit(1);
    }
    if ((head = malloc(STRSIZE)) == NULL) {
	fprintf(stderr, "Error! on malloc: head."); exit(1);
    }
    if ((tail = malloc(STRSIZE)) == NULL) {
	fprintf(stderr, "Error! on malloc: tail."); exit(1);
    }

    /* コマンドライン */
    if (1 < argc && *(argv[1]) == '-') {
	if (chrmatch(argv[1],'v')) {
	    putmsg(version_msg);
	    return 0;
	}
	if (chrmatch(argv[1],'h')) {
	    putmsg(usage_msg);
	    return 0;
	}
	chgopt(argv[1]);
    }

    /* 配列の初期化 */
    initialize();

    /* 読み込み */
    do {
	strcpy(buff,""); /* 前の内容を消去 */
	fgets(buff, BUFSIZE, stdin); /* 入力はbuffで受ける */
	buflen = strlen(buff);

	if (buflen == 0) {
	    break;
	}
	else if (buff[buflen-1] == '\n' || feof(stdin)) {
	    if (buff[buflen-1] == '\n')
		buff[buflen-1] = '\0';

	    if (block>1)
		strcat(line, buff);
	    else if (buflen == 0) { /* 空行 */
		puts("");
		continue;
	    }
	    request = block>1 ? line : buff;

	    if (request[0] == '#' && request[1] == '-') {
		chgopt(buff);
		continue;
	    }

	    if (alt)
		puts(request);
	    if (inv2) {
		inv = 0;
		puts(jk(request));
		inv = 1;
	    }
	    puts(jk(request));
	    if (alt2)
		puts("");
	    block = 1;
	}
	else {
	    if (block == 1)
		strcpy(line, buff);
	    else
		strcat(line, buff);

	    block++;
	    if (maxbuff < block) {
		maxbuff++;
		line = realloc(line, maxbuff * BUFSIZE);
		if (line == NULL) {
		    fprintf(stderr, "Error! on realloc: line.");
		    exit(1);
		}
		self = realloc(self, maxbuff * STRSIZE);
		if (self == NULL) {
		    fprintf(stderr, "Error! on realloc: self.");
		    exit(1);
		}
		dest = realloc(dest, maxbuff * STRSIZE);
		if (dest == NULL) {
		    fprintf(stderr, "Error! on realloc: dest.");
		    exit(1);
		}
		head = realloc(head, maxbuff * STRSIZE);
		if (head == NULL) {
		    fprintf(stderr, "Error! on realloc: head.");
		    exit(1);
		}
		tail = realloc(tail, maxbuff * STRSIZE);
		if (tail == NULL) {
		    fprintf(stderr, "Error! on realloc: tail.");
		    exit(1);
		}
	    }
	}
    } while (! feof(stdin));

#ifdef DEBUGGING
    {
	int maxsize = maxbuff * STRSIZE;
	fprintf(stderr, "size:%d\n", maxsize);

	fprintf(stderr, "self:%d\n", selflen);
	if (selflen > maxsize)
	    fprintf(stderr, "OVERFLOW self!!\n");

	fprintf(stderr, "dest:%d\n", destlen);
	if (destlen > maxsize)
	    fprintf(stderr, "OVERFLOW dest!!\n");
    }
#endif

    return 0;
}
#endif

/* END */

