⛏️ index : haiku.git

/* Copyright 1992 NEC Corporation, Tokyo, Japan.
 *
 * Permission to use, copy, modify, distribute and sell this software
 * and its documentation for any purpose is hereby granted without
 * fee, provided that the above copyright notice appear in all copies
 * and that both that copyright notice and this permission notice
 * appear in supporting documentation, and that the name of NEC
 * Corporation not be used in advertising or publicity pertaining to
 * distribution of the software without specific, written prior
 * permission.  NEC Corporation makes no representations about the
 * suitability of this software for any purpose.  It is provided "as
 * is" without express or implied warranty.
 *
 * NEC CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN 
 * NO EVENT SHALL NEC CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF 
 * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 
 * OTHER TORTUOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 
 * PERFORMANCE OF THIS SOFTWARE. 
 */

/************************************************************************/
/* THIS SOURCE CODE IS MODIFIED FOR TKO BY T.MURAI 1997
/************************************************************************/


#if !defined(lint) && !defined(__CODECENTER__)
static char rcs_id[] = "@(#) 102.1 $Id: empty.c 14875 2005-11-12 21:25:31Z bonefish $";
#endif /* lint */

#include "canna.h"
#include "patchlevel.h"
#include "RK.h"
#include "RKintern.h"

extern struct RkRxDic *romajidic, *englishdic;

static int inEmptySelfInsert(uiContext d);
static int EmptySelfInsert(uiContext d);
static int EmptyYomiInsert(uiContext d);
static int EmptyQuotedInsert(uiContext d);
static int AlphaSelfInsert(uiContext d);
static int AlphaNop(uiContext d);
static int EmptyQuit(uiContext d);
static int EmptyKakutei(uiContext d);
static int EmptyDeletePrevious(uiContext d);
static int UserMode(uiContext d, extraFunc *estruct);
static int UserSelect(uiContext d, extraFunc *estruct);
static int UserMenu(uiContext d, extraFunc *estruct);
static int ProcExtraFunc(uiContext d, int fnum);
static int HenkanRegion(uiContext d);
static int PhonoEdit(uiContext d);
static int DicEdit(uiContext d);
static int Configure(uiContext d);
static int renbunInit(uiContext d);
static int showVersion(uiContext d);
static int showServer(uiContext d);
static int showGakushu(uiContext d);
static int showInitFile(uiContext d);
static int showRomkanaFile(uiContext d);
static int dicSync(uiContext d);

extern KanjiModeRec yomi_mode, cy_mode;

/* EmptySelfInsert -- ΒΌΒ«ΓŠΒ¬ΒΌΒ«ΒΏΓˆΒ€Γ²Β³ΓŽΓ„ΓͺΓŠΒΈΒ»ΓΊΓŽΓ³Β€ΓˆΒ€Β·Β€Γ†ΓŠΓ–Β€ΒΉΒ΄Γ˜ΒΏΓ΄Β‘Β£
 * 
 */

static int
inEmptySelfInsert(uiContext d)
{
  yomiContext yc = (yomiContext)d->modec;
  int res = 0;

  d->kanji_status_return->info |= KanjiThroughInfo | KanjiEmptyInfo;
  if (!(yc->generalFlags & CANNA_YOMI_END_IF_KAKUTEI)) {
    res = d->nbytes;
  }
  /* else { Β³ΓŽΓ„ΓͺΒ₯Ǒ¼Β₯ΒΏΒ€Γ€Β€Β±Β€Γ²Γ‚Γ”Β€ΓƒΒ€Γ†Β€Β€Β€Γ«ΒΏΓΒ€Γ‹Β€ΓΒ³ΓŽΓ„ΓͺΒ₯Ǒ¼Β₯ΒΏΒ€Γ²Γ…ΓΒ€Β΅Β€ΓŠΒ€Β€ } */

  return res;
}


static int
EmptySelfInsert(uiContext d)
{
  yomiContext yc = (yomiContext)d->modec;
  int res = inEmptySelfInsert(d);

/* ΓƒΒ±ΒΈΓ¬Γ…ΓΓΒΏΒ€ΓŽΒ€ΓˆΒ€Β­Β€Γ‹ yomi mode Β€ΓŽΒ³ΓŽΓ„ΓͺΒ₯­‘¼€¬ empty mode Β€Γ‡Β€ΓΒ³ΓŽΓ„ΓͺΒ₯Β­Β‘ΒΌΒ€Γ‡Β€ΓŠ
   €«€Ã€¿€Γͺ€¹€ë€È‘’€½€ÎΒ₯Β­Β‘ΒΌΒ€ΓŽΒ²Β‘Β²ΒΌΒ€Γ‡Β»Γ Β€Γ³Β€Γ‡Β€Β·Β€ΓžΒ€ΓƒΒ€ΒΏΒ€ΓͺΒ€ΒΉΒ€Γ«Β€ΓŽΒ€ΓŽΒ΅ΓŸΒΊΓ‘Β‘Β£yomi
   mode €Î¾Γ₯€Ë yomi mode Β€Β¬ΒΎΓ¨Β€ΓƒΒ€Γ†Β€Β€Β€Γ«Β€ΓŽΒ€ΓΓƒΒ±ΒΈΓ¬Γ…ΓΓΒΏΒ€ΓŽΒ»ΓΎΒ€Β°Β€Γ©Β€Β€Β€Γ€Β€Γ­Β€Β¦Β€ΓˆΒΈΓ€
   Β€Β¦Β€Β³Β€ΓˆΒ€Γ‡ΓˆΒ½ΓƒΓ‡Β€ΓŽΒΊΓ ΓŽΓΒ€Γ‹Β€Β·Β€Γ†Β€Β€Β€Γ«Β‘Β£Γ‹ΓœΓ…ΓΆΒ€ΓΒ€Β³Β€Γ³Β€ΓŠΒ€Β³Β€ΓˆΒ€Γ€Β€Γͺ€¿€¯€Ê€€‘£ */

  if (yc->next && yc->next->id == YOMI_CONTEXT &&
      yomi_mode.keytbl[d->buffer_return[0]] == CANNA_FN_Kakutei) {
    d->status = EXIT_CALLBACK;
    if (d->cb->func[EXIT_CALLBACK] != NO_CALLBACK) {
      d->kanji_status_return->info &= ~KanjiThroughInfo; /* »Å»â€·€¿ */
      popYomiMode(d);
    }
  }
  return res;
}

/* EmptyYomiInsert -- ‘ûΒ₯ґ¼Β₯Γ‰Β€Γ‹Β°ΓœΒΉΓ”Β€Β·Β‘Β’Γ†Γ‰Β€ΓŸΒ€Γ²Γ†ΓΎΓŽΓΒ€ΒΉΒ€Γ«Β΄Γ˜ΒΏΓ΄
 *
 */


static int
EmptyYomiInsert(uiContext d)
{
  yomiContext yc = (yomiContext)d->modec;

  d->current_mode = (yc->generalFlags & CANNA_YOMI_CHIKUJI_MODE) ?
    &cy_mode : &yomi_mode;
  RomajiClearYomi(d);
  return YomiInsert(d); /* Β₯³‘¼Β₯Γ«Β₯ÐΒ₯ΓƒΒ₯¯€ÎΒ₯ÁΒ₯Β§Β₯ΓƒΒ₯¯€Ï YomiInsert €Ç€¡€ì€ë */
}

/* EmptyQuotedInsert -- ΒΌΒ‘Β€ΓŽΒ°Γ¬Β»ΓΊΒ€Β¬Β€Γ‰Β€ΓŽΒ€Γ¨Β€Β¦Β€ΓŠΓŠΒΈΒ»ΓΊΒ€Γ‡Β€Γ’Β₯ΒΉΒ₯Γ«Β‘ΒΌΒ€Γ‡Γ„ΓŒΒ€ΒΉΒ΄Γ˜ΒΏΓ΄Β‘Β£
 *
 */

/* 
  Empty Β₯ґ¼Β₯Γ‰Β€Γ‡Β€ΓŽ quotedInset €Ï ^Q €Î€è€¦€Êʸ»ú€¬°ì²ó Emacs Β€ΓŠΒ€Γ‰Β€ΓŽΓŠΓ½
  Β€Γ‹Γ„ΓŒΒ€ΓƒΒ€Γ†Β€Β·Β€ΓžΒ€Β¨Β€ΓΒ₯ÞΒ₯ΓƒΒ₯Γ—Β€Β¬ΓŠΓ–Β€Γ©Β€Γ¬Β€Γ†Β€Β·Β€ΓžΒ€Β¦Β€ΓŽΒ€Γ‡Β‘Β’Β₯Β«Β₯ΓŠΒ΄ΓΒ»ΓΊΓŠΓ‘Β΄ΒΉΒ€ΓŽΓŠΓ½Β€Γ‡Β²ΒΏΒ€Β«Β€Γ²
  Β€ΒΉΒ€Γ«Β€ΓŠΒ€Γ³Β€Γ†Β€Β³Β€ΓˆΒ€ΓΓ‰Β¬ΓΓ—Β€ΓŠΒ€Β€Β€ΓŽΒ€Γ‡Β€ΓΒ€ΓŠΒ€Β€Β€ΓŽΒ€Β«Β€ΓŠΒ€Β‘Β‘Β£
 */

static int
EmptyQuotedInsert(uiContext d)
{
  yomiContext yc = (yomiContext)d->modec;

  d->current_mode = (yc->generalFlags & CANNA_YOMI_CHIKUJI_MODE) ?
    &cy_mode : &yomi_mode;
  return YomiQuotedInsert(d);
}

/* 
  AlphaSelfInsert -- ΒΌΒ«ΓŠΒ¬ΒΌΒ«ΒΏΓˆΒ€Γ²Β³ΓŽΓ„ΓͺΓŠΒΈΒ»ΓΊΓŽΓ³Β€ΓˆΒ€Β·Β€Γ†ΓŠΓ–Β€ΒΉΒ΄Γ˜ΒΏΓ΄Β‘Β£
 */

static int
AlphaSelfInsert(uiContext d)
{
  unsigned kanap = (unsigned)d->ch;

  d->kanji_status_return->length = 0;
  d->kanji_status_return->info |= KanjiEmptyInfo;
  d->kanji_status_return->info |= KanjiThroughInfo;
  if ( d->nbytes != 1 || kanap <= 0xa0 || 0xe0 <= kanap ) {
    return d->nbytes;
  }
  else { /* ²¾Ì¾Β₯Β­Β‘ΒΌΓ†ΓΎΓŽΓΒ€ΓŽΒΎΓ¬ΒΉΓ§ */
    if (d->n_buffer > 1) {
      return 1;
    }
    else {
      return 0;
    }
  }
}

static int
AlphaNop(uiContext d)
{
  /* currentModeInfo ۂΒ₯ґ¼Β₯Γ‰ΒΎΓ°ΓŠΓ³Β€Β¬Γ‰Β¬Β€ΒΊΓŠΓ–Β€Γ«Β€Γ¨Β€Β¦Β€Γ‹Β₯Γ€Β₯ߑ¼€ÎΒ₯ґ¼Β₯ɀòÆþ€ì€Æ€Βͺ€¯ */
  d->majorMode = d->minorMode = CANNA_MODE_KigoMode;
  currentModeInfo(d);
  return 0;
}

static int
EmptyQuit(uiContext d)
{
  int res;

  res = inEmptySelfInsert(d);
  d->status = QUIT_CALLBACK;
  if (d->cb->func[QUIT_CALLBACK] != NO_CALLBACK) {
    d->kanji_status_return->info &= ~KanjiThroughInfo; /* »Å»â€·€¿ */
    popYomiMode(d);
  }
  return res;
}

static int
EmptyKakutei(uiContext d)
{
  int res;

  res = inEmptySelfInsert(d);
  d->status = EXIT_CALLBACK;
  if (d->cb->func[EXIT_CALLBACK] != NO_CALLBACK) {
    d->kanji_status_return->info &= ~KanjiThroughInfo; /* »Å»â€·€¿ */
    popYomiMode(d);
  }
  return res;
}

static int
EmptyDeletePrevious(uiContext d)
{
  yomiContext yc = (yomiContext)d->modec;

  if (yc->generalFlags & CANNA_YOMI_DELETE_DONT_QUIT) {
    /* Delete ۂ QUIT Β€Β·Β€ΓŠΒ€Β€Β€ΓŽΒ€Γ‡Β€Β’Β€Γ¬Β€ΓΒ‘Β’selfInsert */
    return inEmptySelfInsert(d);
  }
  else {
    return EmptyQuit(d);
  }
}

extraFunc *
FindExtraFunc(int fnum)
{
  extern extraFunc *extrafuncp;
  extraFunc *extrafunc;

  for (extrafunc = extrafuncp; extrafunc; extrafunc = extrafunc->next) {
    if (extrafunc->fnum == fnum) {
      return extrafunc;
    }
  }
  return (extraFunc *)0;
}

static int
UserMode(uiContext d, extraFunc *estruct)
{
  newmode *nmode = estruct->u.modeptr;
  yomiContext yc = (yomiContext)d->modec;
  int modeid
    = estruct->fnum - CANNA_FN_MAX_FUNC + CANNA_MODE_MAX_IMAGINARY_MODE;

  if (yc->generalFlags & CANNA_YOMI_CHGMODE_INHIBITTED) {
    return NothingChangedWithBeep(d);
  }

  yc->generalFlags &= ~CANNA_YOMI_ATTRFUNCS;
  yc->generalFlags |= nmode->flags;
  if (yc->generalFlags & CANNA_YOMI_END_IF_KAKUTEI) {
    /* Β³ΓŽΓ„Γͺ€Ç½Βͺ€ï€ë€è€¦€ÊΒ₯ґ¼Β₯Γ‰Β€Γ€Β€ΓƒΒ€ΒΏΒ€Γ©Β³ΓŽΓ„ΓͺΒ₯ґ¼Β₯Γ‰Β€Γ‹Β€ΓŠΒ€Γ©Β€ΓŠΒ€Β€ */
    yc->generalFlags &= ~CANNA_YOMI_KAKUTEI;
  }
  yc->romdic = nmode->romdic;
  d->current_mode = yc->myEmptyMode = nmode->emode;

  yc->majorMode = yc->minorMode = yc->myMinorMode = (BYTE)modeid;

  currentModeInfo(d);

  d->kanji_status_return->length = 0;
  return 0;
}

#ifndef NO_EXTEND_MENU /* continues to the bottom of this file */
static int
UserSelect(uiContext d, extraFunc *estruct)
{
  int curkigo = 0, *posp = (int *)0;
  kigoIchiran *kigop = (kigoIchiran *)0;
  selectinfo *selinfo = (selectinfo *)0, *info;
  yomiContext yc = (yomiContext)d->modec;

  if (yc->generalFlags & CANNA_YOMI_CHGMODE_INHIBITTED) {
    return NothingChangedWithBeep(d);
  }    
  info = d->selinfo;
  while (info) {
    if (info->ichiran == estruct->u.kigoptr) {
      selinfo = info;
      break;
    }
    info = info->next;
  }

  if (!selinfo) {
    selinfo = (selectinfo *)malloc(sizeof(selectinfo));
    /* malloc €Ë¼ºÇԀ·€¿¾ì¹ç€Ï‘’Á°²óÁΒͺΓ‚Γ²Β€Β·Β€ΒΏΓˆΓ–ΒΉΓ¦Β€Β¬ΓŠΓΓ‚ΒΈΒ€Β΅Β€Γ¬Β€ΓŠΒ€Β€ */
    if (selinfo) {
      selinfo->ichiran = estruct->u.kigoptr;
      selinfo->curnum = 0;
      selinfo->next = d->selinfo;
      d->selinfo = selinfo;
    }
  }

  if (selinfo) {
    curkigo = selinfo->curnum;
    posp = &selinfo->curnum;
  }

  kigop = estruct->u.kigoptr;
  if (!kigop) {
    return NothingChangedWithBeep(d);
  }
  return uuKigoMake(d, kigop->kigo_data, kigop->kigo_size, 
                    curkigo, kigop->kigo_mode, (int(*)(...))uuKigoGeneralExitCatch, posp);
}
  
static int
UserMenu(uiContext d, extraFunc *estruct)
{
  return showmenu(d, estruct->u.menuptr);
}
#endif /* NO_EXTEND_MENU */

/* Β₯Γ‡Β₯Γ•Β₯Β©Β₯Γ«Β₯Ȱʳ°€ÎΒ₯ґ¼Β₯Γ‰Β»ΓˆΓΓ‘Β»ΓΎΒ€Γ‹ΒΈΓ†Β€Γ“Β½ΓΒ€ΒΉΒ΄Γ˜ΒΏΓ΄Β€Γ²Γ€ΓšΒ€Γͺʬ€±€ë */

static int
ProcExtraFunc(uiContext d, int fnum)
{
  extraFunc *extrafunc;

  extrafunc = FindExtraFunc(fnum);
  if (extrafunc) {
    switch (extrafunc->keyword) {
      case EXTRA_FUNC_DEFMODE:
        return UserMode(d, extrafunc);
#ifndef NO_EXTEND_MENU
      case EXTRA_FUNC_DEFSELECTION:
        return UserSelect(d, extrafunc);
      case EXTRA_FUNC_DEFMENU:
        return UserMenu(d, extrafunc);
#endif
      default:
        break;
    }
  }
  return NothingChangedWithBeep(d);
}

int
getBaseMode(yomiContext yc)
{
  int res;
  long fl = yc->generalFlags;

  if (yc->myMinorMode) {
    return yc->myMinorMode;
  }
  else if (fl & CANNA_YOMI_ROMAJI) {
    res = CANNA_MODE_ZenAlphaHenkanMode;
  }
  else if (fl & CANNA_YOMI_KATAKANA) {
    res = CANNA_MODE_ZenKataHenkanMode;
  }
  else {
    res = CANNA_MODE_ZenHiraHenkanMode;
  }
  if (fl & CANNA_YOMI_BASE_HANKAKU) {
    res++;
  }
  if (fl & CANNA_YOMI_KAKUTEI) {
    res += CANNA_MODE_ZenHiraKakuteiMode - CANNA_MODE_ZenHiraHenkanMode;
  }
  if (res == CANNA_MODE_ZenHiraHenkanMode) {
    if (chikujip(yc)) {
      res = CANNA_MODE_ChikujiYomiMode;
    }
    else {
      res = CANNA_MODE_HenkanMode;
    }
  }
  return res;
}

/* Β₯ّ¼Β₯ΒΉΓŠΒΈΒ»ΓΊΒ€ΓŽΓ€ΓšΒ€ΓͺΓ‚Γ˜Β€Β¨ */

void
EmptyBaseModeInfo(uiContext d, yomiContext yc)
{
  coreContext cc = (coreContext)d->modec;

  cc->minorMode = getBaseMode(yc);
  currentModeInfo(d);
}

int
EmptyBaseHira(uiContext d)
{
  yomiContext yc = (yomiContext)d->modec;

  if (yc->generalFlags & CANNA_YOMI_CHGMODE_INHIBITTED) {
    return NothingChangedWithBeep(d);
  }
  yc->generalFlags &= ~(CANNA_YOMI_KATAKANA | CANNA_YOMI_HANKAKU |
			CANNA_YOMI_ROMAJI | CANNA_YOMI_ZENKAKU);
  EmptyBaseModeInfo(d, yc);
  return 0;
}

int
EmptyBaseKata(uiContext d)
{
  yomiContext yc = (yomiContext)d->modec;

  if ((yc->generalFlags & CANNA_YOMI_CHGMODE_INHIBITTED)
      || (cannaconf.InhibitHankakuKana
	  && (yc->generalFlags & CANNA_YOMI_BASE_HANKAKU))) {
    return NothingChangedWithBeep(d);
  }
  yc->generalFlags &= ~(CANNA_YOMI_ROMAJI | CANNA_YOMI_ZENKAKU);
  yc->generalFlags |= CANNA_YOMI_KATAKANA |
    ((yc->generalFlags & CANNA_YOMI_BASE_HANKAKU) ? CANNA_YOMI_HANKAKU : 0);
  EmptyBaseModeInfo(d, yc);
  return 0;
}

int
EmptyBaseEisu(uiContext d)
{
  yomiContext yc = (yomiContext)d->modec;

  if (yc->generalFlags & CANNA_YOMI_CHGMODE_INHIBITTED) {
    return NothingChangedWithBeep(d);
  }
/*  yc->generalFlags &= ~CANNA_YOMI_ATTRFUNCS; Β₯Β―Β₯ΓͺΒ₯’€¹€ë€Î€À€Ñ */
  yc->generalFlags |= CANNA_YOMI_ROMAJI |
    ((yc->generalFlags & CANNA_YOMI_BASE_HANKAKU) ? 0 : CANNA_YOMI_ZENKAKU);
  EmptyBaseModeInfo(d, yc);
  return 0;
}

int
EmptyBaseZen(uiContext d)
{
  yomiContext yc = (yomiContext)d->modec;

  if (yc->generalFlags & CANNA_YOMI_CHGMODE_INHIBITTED) {
    return NothingChangedWithBeep(d);
  }
  yc->generalFlags &= ~CANNA_YOMI_BASE_HANKAKU;
  if (yc->generalFlags & CANNA_YOMI_ROMAJI) {
    yc->generalFlags |= CANNA_YOMI_ZENKAKU;
  }
  /* լ̒ Β₯푼Β₯Þ»úΒ₯ґ¼Β₯ɀǀ«€ÄΒ₯Β«Β₯ΒΏΒ₯Β«Β₯ÊΒ₯ґ¼Β₯Γ‰Β€ΓŽΒ»ΓΎΒ€Β¬Β€Β’Β€Γ«
          (Β€Β½Β€ΓŽΒΎΓ¬ΒΉΓ§Γ‰Β½ΓŒΓŒΒΎΓ₯€ÏΒ₯푼Β₯Þ»úΒ₯ґ¼Β₯Γ‰) */
  if (yc->generalFlags & CANNA_YOMI_KATAKANA) {
    yc->generalFlags &= ~CANNA_YOMI_HANKAKU;
  }
  EmptyBaseModeInfo(d, yc);
  return 0;
}

int
EmptyBaseHan(uiContext d)
{
  yomiContext yc = (yomiContext)d->modec;

  if ((yc->generalFlags & CANNA_YOMI_CHGMODE_INHIBITTED) ||
      /* Β₯ґ¼Β₯Γ‰ΓŠΓ‘ΒΉΒΉΒ€Β¬ΒΆΓ˜Β»ΓŸΒ€Β΅Β€Γ¬Β€Γ†Β€Β€Β€Γ«Β€ΓˆΒ€Β« */
      (cannaconf.InhibitHankakuKana &&
       (yc->generalFlags & CANNA_YOMI_KATAKANA) &&
       !(yc->generalFlags & CANNA_YOMI_ROMAJI))) {
    /* ΓˆΒΎΒ³Γ‘Β₯Β«Β₯ΓŠΒ€Β¬ΒΆΓ˜Β»ΓŸΒ€Β΅Β€Γ¬Β€Γ†Β€Β€Β€Γ«Β€ΓŽΒ€Γ‹ΓˆΒΎΒ³Γ‘Β₯Β«Β₯ΓŠΒ€Γ‹Β€Β€Β€Β­Β€Β½Β€Β¦Β€ΓŠΒ€ΓˆΒ€Β­ */
    return NothingChangedWithBeep(d);
  }
  yc->generalFlags |= CANNA_YOMI_BASE_HANKAKU;
  if (yc->generalFlags & CANNA_YOMI_ROMAJI) {
    yc->generalFlags &= ~CANNA_YOMI_ZENKAKU;
  }
  /* լ̒ Β₯푼Β₯Þ»úΒ₯ґ¼Β₯ɀǀ«€ÄΒ₯Β«Β₯ΒΏΒ₯Β«Β₯ÊΒ₯ґ¼Β₯Γ‰Β€ΓŽΒ»ΓΎΒ€Β¬Β€Β’Β€Γ«
          (Β€Β½Β€ΓŽΒΎΓ¬ΒΉΓ§Γ‰Β½ΓŒΓŒΒΎΓ₯€ÏΒ₯푼Β₯Þ»úΒ₯ґ¼Β₯Γ‰) */
  if (yc->generalFlags & CANNA_YOMI_KATAKANA) {
    if (!cannaconf.InhibitHankakuKana) {
      yc->generalFlags |= CANNA_YOMI_HANKAKU;
    }
  }
  EmptyBaseModeInfo(d, yc);
  return 0;
}

int
EmptyBaseKana(uiContext d)
{
  yomiContext yc = (yomiContext)d->modec;

  if ((yc->generalFlags & CANNA_YOMI_CHGMODE_INHIBITTED) ||
      /* Β₯ґ¼Β₯Γ‰ΓŠΓ‘ΒΉΒΉΒ€Β¬ΒΆΓ˜Β»ΓŸΒ€Β΅Β€Γ¬Β€Γ†Β€Β€Β€ΒΏΒ€Γͺ */
      (!cannaconf.InhibitHankakuKana &&
       (yc->generalFlags & CANNA_YOMI_KATAKANA) &&
       (yc->generalFlags & CANNA_YOMI_BASE_HANKAKU))) {
    /* ΓˆΒΎΒ³Γ‘Β₯Β«Β₯ΓŠΒ€Β¬ΒΆΓ˜Β»ΓŸΒ€Β΅Β€Γ¬Β€Γ†Β€Β€Β€Γ«Β€ΓŽΒ€Γ‹ΓˆΒΎΒ³Γ‘Β₯Β«Β₯ΓŠΒ€Γ‹Β€ΓŠΒ€ΓƒΒ€Γ†Β€Β·Β€ΓžΒ€Β€Β€Β½Β€Β¦Β€ΓŠΒΎΓ¬ΒΉΓ§ */
    return NothingChangedWithBeep(d);
  }
  yc->generalFlags &= ~(CANNA_YOMI_ROMAJI | CANNA_YOMI_ZENKAKU);

  if ((yc->generalFlags & CANNA_YOMI_BASE_HANKAKU) &&
      (yc->generalFlags & CANNA_YOMI_KATAKANA)) {
    yc->generalFlags |= CANNA_YOMI_HANKAKU;
  }
  EmptyBaseModeInfo(d, yc);
  return 0;
}

int
EmptyBaseKakutei(uiContext d)
{
  yomiContext yc = (yomiContext)d->modec;

  if (yc->generalFlags & CANNA_YOMI_CHGMODE_INHIBITTED) {
    return NothingChangedWithBeep(d);
  }
  yc->generalFlags |= CANNA_YOMI_KAKUTEI;

  EmptyBaseModeInfo(d, yc);
  return 0;
}

int
EmptyBaseHenkan(uiContext d)
{
  yomiContext yc = (yomiContext)d->modec;

  if (yc->generalFlags & CANNA_YOMI_CHGMODE_INHIBITTED) {
    return NothingChangedWithBeep(d);
  }
  yc->generalFlags &= ~CANNA_YOMI_KAKUTEI;

  EmptyBaseModeInfo(d, yc);
  return 0;
}

#ifdef WIN

extern specialfunc (uiContext, int);

static HenkanRegion (uiContext);

static
HenkanRegion(uiContext d)
{
  return specialfunc(d, CANNA_FN_HenkanRegion);
}

static PhonoEdit (uiContext);

static
PhonoEdit(uiContext d)
{
  return specialfunc(d, CANNA_FN_PhonoEdit);
}

static DicEdit (uiContext);

static
DicEdit(uiContext d)
{
  return specialfunc(d, CANNA_FN_DicEdit);
}

static Configure (uiContext);

static
Configure(uiContext d)
{
  return specialfunc(d, CANNA_FN_Configure);
}

#endif

#ifndef NO_EXTEND_MENU
static int
renbunInit(uiContext d)
{
  yomiContext yc = (yomiContext)d->modec;

  if (yc->generalFlags & CANNA_YOMI_CHGMODE_INHIBITTED) {
    return NothingChangedWithBeep(d);
  }    
  d->status = 0;
  killmenu(d);
  if (ToggleChikuji(d, 0) == -1) {
    jrKanjiError = "\317\242\312\270\300\341\312\321\264\271\244\313\300\332"
	"\302\330\244\250\244\353\244\263\244\310\244\254\244\307\244\255"
	"\244\336\244\273\244\363";
                   /* ΓΒ’ΓŠΒΈΓ€Γ‘ΓŠΓ‘Β΄ΒΉΒ€Γ‹Γ€ΓšΓ‚Γ˜Β€Β¨Β€Γ«Β€Β³Β€ΓˆΒ€Β¬Β€Γ‡Β€Β­Β€ΓžΒ€Β»Β€Γ³ */
    makeGLineMessageFromString(d, jrKanjiError);
    currentModeInfo(d);
    return(-1);
  }
  else {
    makeGLineMessageFromString(d, "\317\242\312\270\300\341\312\321\264\271"
	"\244\313\300\332\302\330\244\250\244\336\244\267\244\277");
                   /* ΓΒ’ΓŠΒΈΓ€Γ‘ΓŠΓ‘Β΄ΒΉΒ€Γ‹Γ€ΓšΓ‚Γ˜Β€Β¨Β€ΓžΒ€Β·Β€ΒΏ */
    currentModeInfo(d);
    return 0;
  }
}

static int
showVersion(uiContext d)
{
  int retval = 0;
  char s[512];
  yomiContext yc = (yomiContext)d->modec;

  if (yc->generalFlags & CANNA_YOMI_CHGMODE_INHIBITTED) {
    return NothingChangedWithBeep(d);
  }    
  d->status = 0;
  killmenu(d);

  sprintf(s, "\306\374\313\334\270\354\306\376\316\317\245\267\245\271\245\306"
	"\245\340\241\330\244\253\244\363\244\312\241\331Version %d.%d",
	  cannaconf.CannaVersion / 1000, cannaconf.CannaVersion % 1000);
             /* Γ†ΓΌΓ‹ΓœΒΈΓ¬Γ†ΓΎΓŽΓΒ₯Β·Β₯ΒΉΒ₯Γ†Β₯Γ Β‘Γ˜Β€Β«Β€Γ³Β€ΓŠΒ‘Γ™ */
  strcat(s, CANNA_PATCH_LEVEL);
  makeGLineMessageFromString(d, s);
  currentModeInfo(d);

  return (retval);
}

static int
showServer(uiContext d)
{
#ifndef STANDALONE /* This is not used in Windows environment 1996.7.30 kon */
  int retval = 0;
  char s[512];
  extern defaultContext;
  yomiContext yc = (yomiContext)d->modec;

  if (yc->generalFlags & CANNA_YOMI_CHGMODE_INHIBITTED) {
    return NothingChangedWithBeep(d);
  }    
  d->status = 0;
  killmenu(d);

  if(defaultContext == -1) {
    sprintf(s, "\244\253\244\312\264\301\273\372\312\321\264\271\245\265"
	"\241\274\245\320\244\310\244\316\300\334\302\263\244\254\300\332"
	"\244\354\244\306\244\244\244\336\244\271");
               /* Β€Β«Β€ΓŠΒ΄ΓΒ»ΓΊΓŠΓ‘Β΄ΒΉΒ₯¡‘¼Β₯ΓΒ€ΓˆΒ€ΓŽΓ€ΓœΓ‚Β³Β€Β¬Γ€ΓšΒ€Γ¬Β€Γ†Β€Β€Β€ΓžΒ€ΒΉ */
  }
  else {
    sprintf(s, "%s \244\316\244\253\244\312\264\301\273\372\312\321\264\271"
	"\245\265\241\274\245\320\244\313\300\334\302\263\244\267\244\306"
	"\244\244\244\336\244\271", RkwGetServerName());
               /* Β€ΓŽΒ€Β«Β€ΓŠΒ΄ΓΒ»ΓΊΓŠΓ‘Β΄ΒΉΒ₯¡‘¼Β₯ΓΒ€Γ‹Γ€ΓœΓ‚Β³Β€Β·Β€Γ†Β€Β€Β€ΓžΒ€ΒΉ */
  }
  makeGLineMessageFromString(d, s);
  currentModeInfo(d);

  return (retval);
#else
  return (0);
#endif /* STANDALONE */
}

static int
showGakushu(uiContext d)
{
  int retval = 0;
  yomiContext yc = (yomiContext)d->modec;

  if (yc->generalFlags & CANNA_YOMI_CHGMODE_INHIBITTED) {
    return NothingChangedWithBeep(d);
  }    
  d->status = 0;
  killmenu(d);
  
  if (cannaconf.Gakushu == 1) {
    makeGLineMessageFromString(d, "\263\330\275\254\244\254\243\317\243\316"
	"\244\316\276\365\302\326\244\307\244\271");
                                  /* Β³Γ˜Β½Β¬Β€Β¬Β£ΓΒ£ΓŽΒ€ΓŽΒΎΓ΅Γ‚Γ–Β€Γ‡Β€ΒΉ */
  }
  else {
    makeGLineMessageFromString(d, "\263\330\275\254\244\254\243\317\243\306"
	"\243\306\244\316\276\365\302\326\244\307\244\271");
                                  /* Β³Γ˜Β½Β¬Β€Β¬Β£ΓΒ£Γ†Β£Γ†Β€ΓŽΒΎΓ΅Γ‚Γ–Β€Γ‡Β€ΒΉ */
  }
    currentModeInfo(d);

  return (retval);
}

static int
showInitFile(uiContext d)
{
  int retval = 0;
  char s[512];
  extern char *CANNA_initfilename;
  yomiContext yc = (yomiContext)d->modec;

  if (yc->generalFlags & CANNA_YOMI_CHGMODE_INHIBITTED) {
    return NothingChangedWithBeep(d);
  }    
  d->status = 0;
  killmenu(d);

  if (CANNA_initfilename && strlen(CANNA_initfilename)) {
    sprintf(s, "\245\253\245\271\245\277\245\336\245\244\245\272\245\325"
	"\245\241\245\244\245\353\244\317 %s \244\362\273\310\315\321\244\267"
	"\244\306\244\244\244\336\244\271", CANNA_initfilename);
               /* Β₯Β«Β₯ΒΉΒ₯ΒΏΒ₯ÞΒ₯Β€Β₯ΒΊΒ₯Γ•Β₯Β‘Β₯Β€Β₯ë€Ï %s Β€Γ²Β»ΓˆΓΓ‘Β€Β·Β€Γ†Β€Β€Β€ΓžΒ€ΒΉ */
    makeGLineMessageFromString(d, s);
  }
  else {
    sprintf(s, "\245\253\245\271\245\277\245\336\245\244\245\272\245\325"
	"\245\241\245\244\245\353\244\317\300\337\304\352\244\265\244\354"
	"\244\306\244\244\244\336\244\273\244\363");
               /* Β₯Β«Β₯ΒΉΒ₯ΒΏΒ₯ÞΒ₯Β€Β₯ΒΊΒ₯Γ•Β₯Β‘Β₯Β€Β₯Γ«Β€ΓΓ€ΓŸΓ„ΓͺΒ€Β΅Β€Γ¬Β€Γ†Β€Β€Β€ΓžΒ€Β»Β€Γ³ */
    makeGLineMessageFromString(d, s);
  }
    currentModeInfo(d);

  return (retval);
}

static int
showRomkanaFile(uiContext d)
{
  int retval = 0;
  char s[512];
  extern char *RomkanaTable;
  yomiContext yc = (yomiContext)d->modec;

  if (yc->generalFlags & CANNA_YOMI_CHGMODE_INHIBITTED) {
    return NothingChangedWithBeep(d);
  }    
  d->status = 0;
  killmenu(d);
  
  if (RomkanaTable && romajidic) {
    sprintf(s, "\245\355\241\274\245\336\273\372\244\253\244\312\312\321"
	"\264\271\245\306\241\274\245\326\245\353\244\317 %s \244\362\273\310"
	"\315\321\244\267\244\306\244\244\244\336\244\271",
	    RomkanaTable);
               /* Β₯푼Β₯ΓžΒ»ΓΊΒ€Β«Β€ΓŠΓŠΓ‘Β΄ΒΉΒ₯Ƒ¼Β₯Γ–Β₯ë€Ï %s Β€Γ²Β»ΓˆΓΓ‘Β€Β·Β€Γ†Β€Β€Β€ΓžΒ€ΒΉ */
    makeGLineMessageFromString(d, s);
  }
  else {
    sprintf(s, "\245\355\241\274\245\336\273\372\244\253\244\312\312\321"
	"\264\271\245\306\241\274\245\326\245\353\244\317\273\310\315\321"
	"\244\265\244\354\244\306\244\244\244\336\244\273\244\363");
               /* Β₯푼Β₯ΓžΒ»ΓΊΒ€Β«Β€ΓŠΓŠΓ‘Β΄ΒΉΒ₯Ƒ¼Β₯Γ–Β₯Γ«Β€ΓΒ»ΓˆΓΓ‘Β€Β΅Β€Γ¬Β€Γ†Β€Β€Β€ΓžΒ€Β»Β€Γ³ */
    makeGLineMessageFromString(d, s);
  }
    currentModeInfo(d);

  return (retval);
}

static int
dicSync(uiContext d)
{
  int retval = 0;
  char s[512];
  extern int defaultContext;
  yomiContext yc = (yomiContext)d->modec;

  if (yc->generalFlags & CANNA_YOMI_CHGMODE_INHIBITTED) {
    return NothingChangedWithBeep(d);
  }    
  d->status = 0;
  killmenu(d);

  retval = RkwSync(defaultContext, "");
  sprintf(s, "\274\255\275\361\244\316 Sync \275\350\315\375%s",
          retval < 0 ? "\244\313\274\272\307\324\244\267\244\336\244\267"
	"\244\277" : "\244\362\271\324\244\244\244\336\244\267\244\277");
          /* ¼­½ñ€Î Sync ½èÍý%s",
                retval < 0 ? "Β€Γ‹ΒΌΒΊΓ‡Γ”Β€Β·Β€ΓžΒ€Β·Β€ΒΏ" : "Β€Γ²ΒΉΓ”Β€Β€Β€ΓžΒ€Β·Β€ΒΏ */
  makeGLineMessageFromString(d, s);
  currentModeInfo(d);

  return 0;
}
#endif /* not NO_EXTEND_MENU */

#include "emptymap.h"
#include "alphamap.h"