⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 libjcode.c

📁 julius version 4.12.about sound recognition.
💻 C
字号:
/*  *  libjcode.c -- 戳机恃垂ライブラリ    1.0 惹 *                (C) Kuramitsu Kimio, Tokyo Univ. 1996-97 * *  このライブラリは、CGI Programming with C and Perl のために *  Ken Lunde 螟 ≈泣塑胳攫鼠借妄∽ (O'llery) を徊雇にして、 *  ストリ〖ム脱だったjconv.c を、ストリング滦炳にしてライブラリ步 *  しました。  *  ただし、CGI (INTERNET)での网脱を雇えて、恃构してあります。 *//* modified by ri to avoid may malloc */ #include <stdio.h>#include <stdlib.h>#include <string.h>#include <locale.h>#include "jlib.h"#include "jlibconfig.h"#include <sent/stddefs.h> extern int detectKanjiCode(char *str);static unsigned char *_to_jis(unsigned char *str);static unsigned char *_to_ascii(unsigned char *str);static void _jis_shift(int *p1, int *p2);static void _sjis_shift(int *p1, int *p2);static unsigned char *_sjis_han2zen(unsigned char *str, int *p1, int *p2);static void _shift2seven(unsigned char *str, unsigned char *str2);static void _shift2euc(unsigned char *str, unsigned char *str2);static void _shift_self(unsigned char *str, unsigned char *str2);static void _euc2seven(unsigned char *str, unsigned char *str2);static void _euc2shift(unsigned char *str, unsigned char *str2);static unsigned char *_skip_esc(unsigned char *str, int *esc_in);static void _seven2shift(unsigned char *str, unsigned char *str2);static void _seven2euc(unsigned char *str, unsigned char *str2);#define CHAROUT(ch) *str2 = (unsigned char)(ch); str2++;/* --------------------------------------- JIS(ISO-2022) コ〖ドへ磊り仑え -- */static unsigned char *_to_jis(unsigned char *str) {  *str = (unsigned char)ESC; str++;  *str = (unsigned char)'$'; str++;  *str = (unsigned char)'B'; str++;  return str;}/* ----------------------------------------------- ASCII コ〖ドへ磊り仑え -- *//* ESC ( B と ESC ( J の般い。   塑丸は、 ESC ( J が赖しいJIS-Roman 挛废であるが、   インタ〖ネットの惧では、毖眶机はASCII の数が极脸かと蛔われる。   \ 淡规と ~淡规が般うだけである。 */static unsigned char *_to_ascii(unsigned char *str) {  *str = (unsigned char)ESC; str++;  *str = (unsigned char)'('; str++;  *str = (unsigned char)'B'; str++;  return str;}/* -------------------------------------- JIS コ〖ド を SJISとしてシフト -- */static void _jis_shift(int *p1, int *p2){  unsigned char c1 = *p1;  unsigned char c2 = *p2;  int rowOffset = c1 < 95 ? 112 : 176;  int cellOffset = c1 % 2 ? (c2 > 95 ? 32 : 31) : 126;  *p1 = ((c1 + 1) >> 1) + rowOffset;  *p2 += cellOffset;}/* --------------------------------- SJIS コ〖ドをJIS コ〖ドとしてシフト -- */static void _sjis_shift(int *p1, int *p2){  unsigned char c1 = *p1;  unsigned char c2 = *p2;  int adjust = c2 < 159;  int rowOffset = c1 < 160 ? 112 : 176;  int cellOffset = adjust ? (c2 > 127 ? 32 : 31) : 126;  *p1 = ((c1 - rowOffset) << 1) - adjust;  *p2 -= cellOffset;}/* ---------------------------------------------- SJIS 染逞を链逞に恃垂 -- */#define HANKATA(a)  (a >= 161 && a <= 223)#define ISMARU(a)   (a >= 202 && a <= 206)#define ISNIGORI(a) ((a >= 182 && a <= 196) || (a >= 202 && a <= 206) || (a == 179))static int stable[][2] = {    {129,66},{129,117},{129,118},{129,65},{129,69},{131,146},{131,64},    {131,66},{131,68},{131,70},{131,72},{131,131},{131,133},{131,135},    {131,98},{129,91},{131,65},{131,67},{131,69},{131,71},{131,73},    {131,74},{131,76},{131,78},{131,80},{131,82},{131,84},{131,86},    {131,88},{131,90},{131,92},{131,94},{131,96},{131,99},{131,101},    {131,103},{131,105},{131,106},{131,107},{131,108},{131,109},    {131,110},{131,113},{131,116},{131,119},{131,122},{131,125},    {131,126},{131,128},{131,129},{131,130},{131,132},{131,134},    {131,136},{131,137},{131,138},{131,139},{131,140},{131,141},    {131,143},{131,147},{129,74},{129,75}};static unsigned char *_sjis_han2zen(unsigned char *str, int *p1, int *p2){  register int c1, c2;  c1 = (int)*str; str++;  *p1 = stable[c1 - 161][0];  *p2 = stable[c1 - 161][1];  /* 蛮不、染蛮不の借妄 */  c2 = (int)*str;  if (c2 == 222 && ISNIGORI(c1)) {    if ((*p2 >= 74 && *p2 <= 103) || (*p2 >= 110 && *p2 <= 122))      (*p2)++;    else if (*p1 == 131 && *p2 == 69)      *p2 = 148;    str++;  }  if (c2 == 223 && ISMARU(c1) && (*p2 >= 110 && *p2 <= 122) ) {    *p2 += 2;    str++;  }  return str++;}/* -------------------------------------------------- SJIS コ〖ドを恃垂 -- */#define SJIS1(A)    ((A >= 129 && A <= 159) || (A >= 224 && A <= 239))#define SJIS2(A)    (A >= 64 && A <= 252)static void _shift2seven(unsigned char *str, unsigned char *str2){  int p1,p2,esc_in = FALSE;  while ((p1 = (int)*str) != '\0') {    if (SJIS1(p1)) {      if((p2 = (int)*(++str)) == '\0') break;      if (SJIS2(p2)) {        _sjis_shift(&p1,&p2);        if (!esc_in) {          esc_in = TRUE;          str2 = _to_jis(str2);        }      }      CHAROUT(p1);      CHAROUT(p2);      str++;      continue;    }#ifdef NO_HANKAKU_SJIS    /* 染逞 SJIS は、动扩弄に链逞に恃える */    if (HANKATA(p1)) {      str = _sjis_han2zen(str, &p1, &p2);      _sjis_shift(&p1,&p2);      if (!esc_in) {        esc_in = TRUE;        str2 = _to_jis(str2);      }      CHAROUT(p1);      CHAROUT(p2);      continue;    }#endif    if (esc_in) {      /* LF / CR の眷圭は、赖撅にエスケ〖プアウトされる */      esc_in = FALSE;      str2 = _to_ascii(str2);    }    CHAROUT(p1);    str++;  }  if (esc_in)    str2 = _to_ascii(str2);  *str2='\0';}/* --------------------------------------------- SJIS を EUC に恃垂する -- */static void _shift2euc(unsigned char *str, unsigned char *str2){  int p1,p2;    while ((p1 = (int)*str) != '\0') {    if (SJIS1(p1)) {      if((p2 = (int)*(++str)) == '\0') break;      if (SJIS2(p2)) {        _sjis_shift(&p1,&p2);        p1 += 128;        p2 += 128;      }      CHAROUT(p1);      CHAROUT(p2);      str++;      continue;    }#ifdef NO_HANKAKU_SJIS    /* 染逞 SJIS は、动扩弄に链逞に恃える */    if (HANKATA(p1)) {      str = _sjis_han2zen(str,&p1,&p2);      _sjis_shift(&p1,&p2);      p1 += 128;      p2 += 128;      CHAROUT(p1);      CHAROUT(p2);      continue;    }#endif    CHAROUT(p1);    str++;  }  *str2='\0';}/* ------------------------------------------------- 染逞 SJIS を艰り近く -- */static void _shift_self(unsigned char *str, unsigned char *str2){  int p1;    while ((p1 = (int)*str) != '\0') {#ifdef NO_HANKAKU_SJIS    /* 染逞 SJIS は、动扩弄に链逞に恃える */    if (HANKATA(p1)) {      str = _sjis_han2zen(str, &p1, &p2);      CHAROUT(p1);      CHAROUT(p2);      continue;    }#endif    CHAROUT(p1);    str++;  }  *str2='\0';}/* ------------------------------------------------------EUC から JIS へ -- */#define ISEUC(A)    (A >= 161 && A <= 254)static void _euc2seven(unsigned char *str, unsigned char *str2){  int p1, p2, esc_in = FALSE;  while ((p1 = (int)*str) != '\0') {    if (p1 == LF || p1 == CR) {      if (esc_in) {        esc_in = FALSE;        str2 = _to_ascii(str2);      }      CHAROUT(p1);      str++;      continue;    }    if (ISEUC(p1)) {      if((p2 = (int)*(++str)) == '\0') break;      if (ISEUC(p2)) {	if (!esc_in) {	  esc_in = TRUE;	  str2 =_to_jis(str2);	}	CHAROUT(p1-128);	CHAROUT(p2-128);	str++;	continue;      }    }    if (esc_in) {      esc_in = FALSE;      str2 = _to_ascii(str2);    }    CHAROUT(p1);    str++;  }  *str2='\0';}/* ------------------------------------------------ EUC から SJIS に恃垂 -- */ static void _euc2shift(unsigned char *str, unsigned char *str2){  int p1,p2;  while ((p1 = (int)*str) != '\0') {    if (ISEUC(p1)) {      if((p2 = (int)*(++str)) == '\0') break;      if (ISEUC(p2)) {	p1 -= 128;        p2 -= 128;        _jis_shift(&p1,&p2);      }      CHAROUT(p1);      CHAROUT(p2);      str++;      continue;    }    CHAROUT(p1);    str++;  }  *str2='\0';}/* -------------------------------------- ESC シ〖ケンスをスキップする ----- */static unsigned char *_skip_esc(unsigned char *str, int *esc_in) {  int c;    c = (int)*(++str);  if ((c == '$') || (c == '(')) str++;  if ((c == 'K') || (c == '$')) *esc_in = TRUE;  else *esc_in = FALSE;  if(*str != '\0') str++;  return str;}/* ----------------------------------------------- JIS を SJIS に恃垂する -- */static void _seven2shift(unsigned char *str, unsigned char *str2){  int p1, p2, esc_in = FALSE;  while ((p1 = (int)*str) != '\0') {    /* ESCシ〖ケンスをスキップする */    if (p1 == ESC) {      str = _skip_esc(str, &esc_in);      continue;    }    if (p1 == LF || p1 == CR) {      if (esc_in) esc_in = FALSE;    }    if(esc_in) { /* ISO-2022-JP コ〖ド */      if((p2 = (int)*(++str)) == '\0') break;      _jis_shift(&p1, &p2);      CHAROUT(p1);      CHAROUT(p2);    }else{       /* ASCII コ〖ド */      CHAROUT(p1);    }    str++;  }  *str2 = '\0';}/* ------------------------------------------------ JIS を EUC に恃垂する -- */static void _seven2euc(unsigned char *str, unsigned char *str2){  int p1, esc_in = FALSE;  while ((p1 = (int)*str) != '\0') {    /* ESCシ〖ケンスをスキップする */    if (p1 == ESC) {      str = _skip_esc(str, &esc_in);      continue;    }    if (p1 == LF || p1 == CR) {      if (esc_in) esc_in = FALSE;    }    if(esc_in) { /* ISO-2022-JP コ〖ド */      CHAROUT(p1 + 128);             if((p1 = (int)*(++str)) == '\0') break;      CHAROUT(p1 + 128);    }else{       /* ASCII コ〖ド */      CHAROUT(p1);    }    str++;  }  *str2 = '\0';}/* ------------------------------------------------------------------------ *//* --------------------------------------------------------- Public 簇眶 -- */char *toStringJIS(char *str, char *buf, int maxlen) {  int detected;  if(!str) return (NULL);  detected = detectKanjiCode(str);  if(detected == ASCII || detected == JIS)    return strncpy(buf, str, maxlen);  if (maxlen < strlen(str) * 2) return NULL;  switch(detected) {  case SJIS :    _shift2seven((unsigned char *)str, (unsigned char *)buf);    break;  case EUC :    _euc2seven((unsigned char *)str, (unsigned char *)buf);    break;  default:    return strncpy(buf, str, maxlen);    break;  }  return buf;}char *toStringEUC(char *str, char *buf, int maxlen) {  int detected;  if(!str) return (NULL);  detected = detectKanjiCode(str);  if(detected == ASCII || detected == EUC)     return strncpy(buf, str, maxlen);  if (maxlen < strlen(str) * 2) return NULL;  switch(detected) {  case SJIS :    _shift2euc((unsigned char *)str, (unsigned char *)buf);    break;  case JIS :  case NEW : case OLD : case NEC :     _seven2euc((unsigned char *)str, (unsigned char*)buf);    break;  default:    return strncpy(buf, str, maxlen);    break;  }  return buf;}char *toStringSJIS(char *str, char *buf, int maxlen) {  int detected;  if (!str) return NULL;  detected = detectKanjiCode(str);  if(detected == ASCII)    return strncpy(buf, str, maxlen);    if (maxlen < strlen(str) * 2) return NULL;  switch(detected) {  case NEW : case OLD : case NEC :  case JIS :    _seven2shift((unsigned char *)str, (unsigned char *)buf);    break;  case EUC :    _euc2shift((unsigned char *)str, (unsigned char *)buf);    break;  case SJIS :    default:    _shift_self((unsigned char *)str, (unsigned char *)buf);  }  return buf;}char *toStringAuto(char *str, char *buf, int maxlen) {  static int  jpcode = -1;  static char *sjis_locale_name[] = {SJIS_LOCALE_NAME, NULL};  static char *jis_locale_name[]  = {JIS_LOCALE_NAME, NULL};  static char *euc_locale_name[]  = {EUC_LOCALE_NAME, NULL};  static struct LOCALETABLE {    int code;    char **name_list;  } locale_table[] = { {SJIS, sjis_locale_name},		     {EUC, euc_locale_name},		     {JIS, jis_locale_name}};  if(!str) return (NULL);  if (jpcode == -1) {    char *ctype = setlocale(LC_CTYPE, "");    int i, j;    for( j=0; jpcode == -1 && 	      j < sizeof(locale_table)/sizeof(struct LOCALETABLE); j++ ) {      char **name = locale_table[j].name_list;      for( i=0; name[i]; i++ )	if (strcasecmp(ctype, name[i]) == 0) {	  jpcode = locale_table[j].code;	  break;	}    }    if(jpcode == -1)        jpcode = ASCII;  }  switch (jpcode) {    case SJIS:      return (toStringSJIS(str, buf, maxlen));    break;    case JIS:    case NEW : case OLD : case NEC :      return (toStringJIS(str, buf, maxlen));    break;    case EUC:      return (toStringEUC(str, buf, maxlen));    break;    default:      return (strncpy(buf, str, maxlen));    break;  }}char *EUCtoSJIS(char *str, char *buf, int maxlen){  if (!str) return NULL;  _euc2shift((unsigned char *)str, (unsigned char *)buf);  return buf;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -