Back to index

im-sdk  12.3.91
Defines | Functions
ctfilter.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "codetable.h"
#include "unit_input.h"
#include "keymap.h"
#include "logf.h"

Go to the source code of this file.

Defines

#define LOOKUP_CHOICE_NUM   6
#define IME_Status   ime_buffer->return_status
#define Input_Buf   ime_buffer->inputkey_buf
#define Input_Len   ime_buffer->inputkey_len
#define Preedit_Buf   ime_buffer->preedit_buf
#define Preedit_Len   ime_buffer->preedit_len
#define Preedit_CaretPos   ime_buffer->preedit_caretpos
#define Commit_Buf   ime_buffer->commit_buf
#define Commit_Len   ime_buffer->commit_len
#define Status_Buf   ime_buffer->status_buf
#define Status_Len   ime_buffer->status_len
#define Lookup_Buf   ime_buffer->lookup_buf
#define Lookup_Num   ime_buffer->lookup_num
#define Lookup_Pos   ime_buffer->cur_lookup_pos
#define Candidates_Buf   ime_buffer->candidates_buf
#define Additions_Buf   ime_buffer->additions_buf

Functions

int Is_UsedCodes_Key (CodeTableStruct *hztbl, int key)
int get_select_num (CodeTableStruct *hztbl, int key)
int Is_Select_Key (CodeTableStruct *hztbl, int key)
int Is_Commit_Key (CodeTableStruct *hztbl, int key)
int Is_BackSpace_Key (CodeTableStruct *hztbl, int key)
int Is_ClearAll_Key (CodeTableStruct *hztbl, int key)
int Is_NextPage_Key (CodeTableStruct *hztbl, int key)
int Is_PrevPage_Key (CodeTableStruct *hztbl, int key)
int get_lookup_result (CodeTableStruct *hztbl, IMEBufferRec *ime_buffer, int nHelpInfoMode, int pos, int max_lookup_num)
int commit_candidate (IMEBufferRec *ime_buffer, int id)
void warning_bell ()
int codetable_filter (CodeTableStruct *hztbl, IMEKey key_event, IMEBufferRec *ime_buffer)

Define Documentation

#define Additions_Buf   ime_buffer->additions_buf

Definition at line 67 of file ctfilter.c.

#define Candidates_Buf   ime_buffer->candidates_buf

Definition at line 66 of file ctfilter.c.

#define Commit_Buf   ime_buffer->commit_buf

Definition at line 59 of file ctfilter.c.

#define Commit_Len   ime_buffer->commit_len

Definition at line 60 of file ctfilter.c.

#define IME_Status   ime_buffer->return_status

Definition at line 53 of file ctfilter.c.

#define Input_Buf   ime_buffer->inputkey_buf

Definition at line 54 of file ctfilter.c.

#define Input_Len   ime_buffer->inputkey_len

Definition at line 55 of file ctfilter.c.

#define Lookup_Buf   ime_buffer->lookup_buf

Definition at line 63 of file ctfilter.c.

#define LOOKUP_CHOICE_NUM   6

Definition at line 51 of file ctfilter.c.

#define Lookup_Num   ime_buffer->lookup_num

Definition at line 64 of file ctfilter.c.

#define Lookup_Pos   ime_buffer->cur_lookup_pos

Definition at line 65 of file ctfilter.c.

#define Preedit_Buf   ime_buffer->preedit_buf

Definition at line 56 of file ctfilter.c.

#define Preedit_CaretPos   ime_buffer->preedit_caretpos

Definition at line 58 of file ctfilter.c.

#define Preedit_Len   ime_buffer->preedit_len

Definition at line 57 of file ctfilter.c.

#define Status_Buf   ime_buffer->status_buf

Definition at line 61 of file ctfilter.c.

#define Status_Len   ime_buffer->status_len

Definition at line 62 of file ctfilter.c.


Function Documentation

int codetable_filter ( CodeTableStruct hztbl,
IMEKey  key_event,
IMEBufferRec ime_buffer 
)

Definition at line 244 of file ctfilter.c.

{
  int     hznum;
  char    ch;
  int     key, pos;
  int nLookup_Pos_Save = 0;
  int  bNeedCheckMore = 0;
 
  int  Max_Lookup_Num = LOOKUP_CHOICE_NUM;
  int  nKeyByKeyMode = hztbl->nKeyByKeyMode;
  int  nHelpInfoMode = hztbl->nHelpInfoMode;
  int  nAutoSelectMode = hztbl->nAutoSelectMode;
  int  nKeyPromptMode = hztbl->nKeyPromptMode;
  int prev_Input_Len;
  static int static_prev_Input_Buf[MAX_INPUT_KEY_NUM];
  int *prev_Input_Buf = static_prev_Input_Buf;
 
  ime_buffer->encode = hztbl->Encode;

  IME_Status = 0;

  key = map_keyevent_to_imekey(hztbl, key_event);
  log_f("ctfilter: map_keyevent_to_imekey: return key:0x%x\n", key);
 
  if (key == IME_NOT_USED_KEY)
    return(IME_NOT_USED_KEY);
 
  switch(hztbl->nSelectKeyMode) {
  case NUMBER_MODE:
    ime_buffer->lookup_label_type = NUMERIC_LABEL;
    break;
  case LOWER_MODE:
    ime_buffer->lookup_label_type = LOWER_LABEL;
    break;
  case UPPER_MODE:
    ime_buffer->lookup_label_type = UPPER_LABEL;
    break;
  default:
    ime_buffer->lookup_label_type = NUMERIC_LABEL;
  }

  if((Is_UsedCodes_Key(hztbl, key)) || (Is_Wildchar_Key(hztbl, key))) { 
    prev_Input_Buf = Input_Buf;
    prev_Input_Len = Input_Len;

    /* if inputted keys length has over the limit */
          
    if (Input_Len >= hztbl->MaxCodes) {
      warning_bell();
      return (IME_USED_KEY);
    }

    /* if not key by key, and is selectkey, and Lookup Mode */
    /* directly select */

    if(!nKeyByKeyMode && (Is_Select_Key(hztbl, key)) && (Lookup_Num>0)) { 

      /* select from candidata */
      /* here should see whether there is enough candidates */

      int select_num;
      select_num = get_select_num(hztbl, key);
      if ((select_num >= 0) && (select_num < Lookup_Num)) {
        commit_candidate(ime_buffer, select_num);
      }else warning_bell();

      return(IME_USED_KEY);
    }

    Input_Buf[Input_Len] = key;
    Input_Len ++;
    Input_Buf[Input_Len] = '\0';

    Lookup_Num = 0;
    bNeedCheckMore = 0;
    /* if need display key by key */
    if (nKeyByKeyMode) {
      nLookup_Pos_Save = Lookup_Pos;
      Lookup_Pos = 0;
      Lookup_Num = get_lookup_result(hztbl, ime_buffer, nHelpInfoMode, Lookup_Pos, Max_Lookup_Num); 
      if (Lookup_Num == 1 && nAutoSelectMode) {
        commit_candidate(ime_buffer, 0);
        return(IME_USED_KEY);
      }

      if (Lookup_Num == 0) {
        log_f("Lookup_Num is zero \n"); 
        /* if key is also a seleck key */
        if (Is_Select_Key(hztbl, key))
          bNeedCheckMore = 1;
        else {
          Input_Buf = prev_Input_Buf;
          Input_Len = prev_Input_Len;
          if (Input_Len == 0) {
            Commit_Len = 0;
            Commit_Buf[Commit_Len] = key;
            Commit_Len++;
            Commit_Buf[Commit_Len] = '\0';
            Commit_Len = strlen((char *)Commit_Buf);
            log_f("codetable_filter: commit_candidate, Commit_Buf <%s>\n",Commit_Buf);
            IME_Status = IME_COMMIT;
            Input_Len = 0;
            Input_Buf[Input_Len] = 0;
            Preedit_Len = 0;
            Preedit_Buf[Preedit_Len] = '\0';
            IME_Status |= IME_PREEDIT_AREA | IME_LOOKUP_AREA;
            return(IME_NOT_USED_KEY);
          }
          nLookup_Pos_Save = Lookup_Pos;
          Lookup_Pos = 0;
          Lookup_Num = get_lookup_result(hztbl, ime_buffer, nHelpInfoMode, Lookup_Pos, Max_Lookup_Num); 
          commit_candidate(ime_buffer, 0);
          Input_Buf[Input_Len] = key;
          Input_Len ++;
          Input_Buf[Input_Len] = '\0';
          Lookup_Num = get_lookup_result(hztbl, ime_buffer, nHelpInfoMode, Lookup_Pos, Max_Lookup_Num);
          if (bNeedCheckMore == 0) {
            Preedit_Buf[Preedit_Len] = key;
            Preedit_Len += 1;
            Preedit_Buf[Preedit_Len] = '\0';
            Preedit_CaretPos = Preedit_Len;
            return(IME_USED_KEY);
          }
        }
      }
      log_f("prev_Input_Len [%d], Input_Len [%d]\n",prev_Input_Len, Input_Len);
      if (prev_Input_Len != Input_Len) {
       Preedit_Buf[Preedit_Len] = key;
       Preedit_Len += 1;
       Preedit_Buf[Preedit_Len] = '\0';
      }
    }else{
      Preedit_Buf[Preedit_Len] = key;
      Preedit_Len += 1;
      Preedit_Buf[Preedit_Len] = '\0';
    }
    Preedit_CaretPos = Preedit_Len;
    IME_Status = IME_PREEDIT_AREA;

    if (bNeedCheckMore == 0) {
      IME_Status |= IME_LOOKUP_AREA;
      return(IME_USED_KEY);
    }
  }
  
  if (bNeedCheckMore == 1) {
    /* restore the original status that before into this function */
    IME_Status = 0;
    Input_Len --;
    Input_Buf[Input_Len] = '\0';
    Lookup_Pos = nLookup_Pos_Save;
    Lookup_Num = get_lookup_result(hztbl, ime_buffer, nHelpInfoMode, Lookup_Pos, Max_Lookup_Num); 
  }

  if (Is_Select_Key(hztbl, key)) { /* select from candidata */
    /* here should see whether there is enough candidates */
    int select_num;

    /*  if no inputted key, directly return this key */
    if (Input_Len==0) return(IME_NOT_USED_KEY);
    log_f("Select Key, key:%c, Lookup_Num:%d\n", key, Lookup_Num);
    select_num = get_select_num(hztbl, key);
    if (Lookup_Num>0 && (select_num >= 0) && (select_num < Lookup_Num)) {
      commit_candidate(ime_buffer, select_num);
    } else warning_bell();

    return(IME_USED_KEY);
  }

  if (Is_ClearAll_Key(hztbl, key)) { 
    /* Esc , clear preedit, lookup choice pointer, and so on */
    log_f("ESC_KEY\n");
    /*  if no inputted key, directly return this key */
    if (Input_Len==0) return(IME_NOT_USED_KEY);
  
    Input_Len = 0;
    Preedit_Len = 0;
    Lookup_Num = 0;
    Preedit_CaretPos = 0;
    IME_Status = IME_PREEDIT_AREA | IME_LOOKUP_AREA;
    return (IME_USED_KEY);
  }

  if (Is_BackSpace_Key(hztbl, key)) { /* Back Space & Delete */
    log_f("BACKSPACE_KEY\n");
    /*  if no inputted key, directly return this key */
    if (Input_Len==0) return(IME_NOT_USED_KEY);
  
    /* Delete characters in pre-edit region */
    Input_Len --;
    if (nKeyPromptMode) {
      ch = Input_Buf[Input_Len];
      log_f("ch:%c, keyprompt:%s\n", ch, hztbl->keyprompt[atoi(&ch)].prompt);
      Preedit_Len -= strlen(hztbl->keyprompt[atoi(&ch)].prompt);
      Preedit_Buf[Preedit_Len] = '\0';
    }else{
      Preedit_Len -= 1;
      Preedit_Buf[Preedit_Len] = '\0';
    }

    Input_Buf[Input_Len] = '\0';
    Preedit_CaretPos = Preedit_Len;
    IME_Status = IME_PREEDIT_AREA;

    Lookup_Num = 0;
  
    /* if still left some keys, and need display key by key, then search. */
    /* else undisplay the candidate window */
    if ((Input_Len > 0) && nKeyByKeyMode) {
      Lookup_Pos = 0;
      Lookup_Num = get_lookup_result(hztbl, ime_buffer, nHelpInfoMode, Lookup_Pos, Max_Lookup_Num); 
    }

    IME_Status |= IME_LOOKUP_AREA;
    return(IME_USED_KEY);

  }

  if (Is_NextPage_Key(hztbl, key)) { /* select from candidata */
    /*  if no inputted key, directly return this key */
    if (Input_Len==0) return(IME_NOT_USED_KEY);

    /* if any preedit key and not in Lookup status */
    log_f("NextPage:  Lookup_Num:%d\n", Lookup_Num);
    if (Lookup_Num==0) return(IME_USED_KEY);

    pos = Lookup_Pos + Max_Lookup_Num;
    log_f("NextPage: pos:%d\n", pos);
    hznum = get_lookup_result(hztbl, ime_buffer, nHelpInfoMode, pos, Max_Lookup_Num); 
    if (hznum > 0) {
      Lookup_Num = hznum;
      Lookup_Pos = pos;
      IME_Status = IME_LOOKUP_AREA;
    }else warning_bell();
    
    return(IME_USED_KEY);

  }

  if (Is_PrevPage_Key(hztbl, key)) { /* select from candidata */

    /*  if no inputted key, directly return this key */
    if (Input_Len==0) return(IME_NOT_USED_KEY);
    log_f("PrevPage:  Lookup_Num:%d\n", Lookup_Num);
    /* if any preedit key and not in Lookup status */
    if (Lookup_Num==0) return(IME_USED_KEY);
  
    /* if in beginning pos */
    if (Lookup_Pos<=0) {
      warning_bell();
      return(IME_USED_KEY);
    }

    pos = Lookup_Pos - Max_Lookup_Num;
    hznum = get_lookup_result(hztbl, ime_buffer, nHelpInfoMode, pos, Max_Lookup_Num); 
    log_f("hznum :%d\n", hznum);
    if (hznum > 0) {
      Lookup_Num = hznum;
      Lookup_Pos = pos;
      IME_Status = IME_LOOKUP_AREA;
    }else warning_bell();

    return(IME_USED_KEY);
  }

  if (Is_Commit_Key(hztbl, key)) { /* space or return key */
    log_f("Space or Return key, Commit Key ===\n");
    /* if no input keys and no candidates */
    if (Input_Len==0 && Lookup_Num==0) 
      return(IME_NOT_USED_KEY);

    /* if any candidates, then commit the first candidate */
    if (Lookup_Num > 0) {
      log_f("Commit Key , Commit the first candidate===\n");
      commit_candidate(ime_buffer, 0);
      return(IME_USED_KEY);
    }

    /* if any keys and key is Space key and mode is not keybykey */
    /* then search and display the candidates */
    if (key == SPACE_KEY && !nKeyByKeyMode) {
      Lookup_Pos = 0;
      Lookup_Num = get_lookup_result(hztbl, ime_buffer, nHelpInfoMode, Lookup_Pos, Max_Lookup_Num); 
      log_f("Lookup_Num:%d\n", Lookup_Num);
      if (Lookup_Num == 1 && nAutoSelectMode) {
        commit_candidate(ime_buffer, 0);
        return(IME_USED_KEY);
      }

      if (Lookup_Num == 0)
        warning_bell();

      IME_Status = IME_LOOKUP_AREA;
      return(IME_USED_KEY);
    }

    return(IME_USED_KEY);
  }

  /* for unnormal keys */
  log_f(" unnormal key:%d\n", key);
  if (Input_Len==0) return(IME_NOT_USED_KEY);
  else return(IME_USED_KEY);
}

Here is the caller graph for this function:

int commit_candidate ( IMEBufferRec ime_buffer,
int  id 
)

Definition at line 218 of file ctfilter.c.

{
  if (id >= Lookup_Num)
    return(-1);

  strcpy((char *)Commit_Buf, (char *)Candidates_Buf[id]);
  Commit_Len = strlen((char *)Commit_Buf);
  log_f("Inside commit_candidate, Commit_Buf <%s>\n",Commit_Buf);
  IME_Status = IME_COMMIT;
  Input_Len = 0;
  Input_Buf[Input_Len] = '\0';
  Preedit_Len = 0;
  Lookup_Num = 0;
  Preedit_CaretPos = 0;
  IME_Status |= IME_PREEDIT_AREA | IME_LOOKUP_AREA;
  return(0);
}

Here is the call graph for this function:

int get_lookup_result ( CodeTableStruct hztbl,
IMEBufferRec ime_buffer,
int  nHelpInfoMode,
int  pos,
int  max_lookup_num 
)

Definition at line 194 of file ctfilter.c.

{
  int i, lookup_num;

  lookup_num = codetable_search(hztbl, Input_Buf, Input_Len, Candidates_Buf, Additions_Buf, pos, max_lookup_num); 
  if (lookup_num > 0)
    {
      for (i=0; i<lookup_num; i++)
       {
         log_f("%d: %s %s\n", i, Candidates_Buf[i], Additions_Buf[i]);
         if (nHelpInfoMode)
           sprintf((char *)Lookup_Buf[i], "%s %s", Candidates_Buf[i], Additions_Buf[i]);
         else
           strcpy(Lookup_Buf[i], Candidates_Buf[i]);
       }
    }
  return(lookup_num);
}

Here is the call graph for this function:

int get_select_num ( CodeTableStruct hztbl,
int  key 
)

Definition at line 79 of file ctfilter.c.

{
  int ret = -1;
  switch(hztbl->nSelectKeyMode)
    {
    case NUMBER_MODE:
      if (key >= '0' && key <= '9')
       ret = (key - '0' + 9) % 10;
      break;

    case LOWER_MODE:
      if (key >= 'a' && key <= 'a' + 10)
       ret = key - 'a';
      break;

    case UPPER_MODE:
      if (key >= 'A' && key <= 'A' + 10)
       ret = key - 'A';
      break;
    }
  return(ret);
}
int Is_BackSpace_Key ( CodeTableStruct hztbl,
int  key 
)

Definition at line 125 of file ctfilter.c.

{
  unsigned char *keylist = hztbl->functionkey[BACKSPACE_KEY_ID].keylist;

  if (key == BACKSPACE_KEY || key == DELETE_KEY)
    return(1);

  if ( keylist[0] )
    {
      if ( index(keylist, key) )
       return(1);
    }

  return(0);
}
int Is_ClearAll_Key ( CodeTableStruct hztbl,
int  key 
)

Definition at line 143 of file ctfilter.c.

{
  unsigned char *keylist = hztbl->functionkey[CLEARALL_KEY_ID].keylist;

  if (key == ESC_KEY)
    return(1);

  if ( keylist[0] )
    {
      if ( index(keylist, key) )
       return(1);
    }
  return(0);
}
int Is_Commit_Key ( CodeTableStruct hztbl,
int  key 
)

Definition at line 115 of file ctfilter.c.

{
  if (key == SPACE_KEY || key == RETURN_KEY)
    return(1);
  else
    return(0);
}
int Is_NextPage_Key ( CodeTableStruct hztbl,
int  key 
)

Definition at line 160 of file ctfilter.c.

{
  unsigned char *keylist = hztbl->functionkey[PAGEDOWN_KEY_ID].keylist;

  if (key == PAGEDOWN_KEY)
    return(1);

  if ( keylist[0] )
    {
      if ( index(keylist, key) )
       return(1);
    }
  return(0);
}
int Is_PrevPage_Key ( CodeTableStruct hztbl,
int  key 
)

Definition at line 177 of file ctfilter.c.

{
  unsigned char *keylist = hztbl->functionkey[PAGEUP_KEY_ID].keylist;

  if (key == PAGEUP_KEY)
    return(1);
 
  if ( keylist[0] )
    {
      if ( index(keylist, key) )
       return(1);
    }
  return(0);
}
int Is_Select_Key ( CodeTableStruct hztbl,
int  key 
)

Definition at line 104 of file ctfilter.c.

{
  int ret = get_select_num(hztbl, key);
  if (ret == -1)
    return(0);
  else
    return(1);
}

Here is the call graph for this function:

int Is_UsedCodes_Key ( CodeTableStruct hztbl,
int  key 
)

Definition at line 69 of file ctfilter.c.

{
  if ( index(hztbl->UsedCodes, key) )
    return(1);
  else
    return(0);
}
void warning_bell ( )

Definition at line 238 of file ctfilter.c.

{
}