File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / libiconv / lib / iso2022_jp2.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 22:57:48 2012 UTC (12 years, 4 months ago) by misho
Branches: libiconv, MAIN
CVS tags: v1_14p0, v1_14, v1_13_1, HEAD
libiconv

    1: /*
    2:  * Copyright (C) 1999-2001, 2008 Free Software Foundation, Inc.
    3:  * This file is part of the GNU LIBICONV Library.
    4:  *
    5:  * The GNU LIBICONV Library is free software; you can redistribute it
    6:  * and/or modify it under the terms of the GNU Library General Public
    7:  * License as published by the Free Software Foundation; either version 2
    8:  * of the License, or (at your option) any later version.
    9:  *
   10:  * The GNU LIBICONV Library is distributed in the hope that it will be
   11:  * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
   12:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   13:  * Library General Public License for more details.
   14:  *
   15:  * You should have received a copy of the GNU Library General Public
   16:  * License along with the GNU LIBICONV Library; see the file COPYING.LIB.
   17:  * If not, write to the Free Software Foundation, Inc., 51 Franklin Street,
   18:  * Fifth Floor, Boston, MA 02110-1301, USA.
   19:  */
   20: 
   21: /*
   22:  * ISO-2022-JP-2
   23:  */
   24: 
   25: /* Specification: RFC 1554 */
   26: /* ESC '(' 'I' for JISX0201 Katakana is an extension not found in RFC 1554 or
   27:    CJK.INF, but implemented in glibc-2.1 and qt-2.0. */
   28: 
   29: #define ESC 0x1b
   30: 
   31: /*
   32:  * The state is composed of one of the following values
   33:  */
   34: #define STATE_ASCII             0
   35: #define STATE_JISX0201ROMAN     1
   36: #define STATE_JISX0201KATAKANA  2
   37: #define STATE_JISX0208          3
   38: #define STATE_JISX0212          4
   39: #define STATE_GB2312            5
   40: #define STATE_KSC5601           6
   41: /*
   42:  * and one of the following values, << 8
   43:  */
   44: #define STATE_G2_NONE           0
   45: #define STATE_G2_ISO8859_1      1
   46: #define STATE_G2_ISO8859_7      2
   47: 
   48: #define SPLIT_STATE \
   49:   unsigned int state1 = state & 0xff, state2 = state >> 8
   50: #define COMBINE_STATE \
   51:   state = (state2 << 8) | state1
   52: 
   53: static int
   54: iso2022_jp2_mbtowc (conv_t conv, ucs4_t *pwc, const unsigned char *s, int n)
   55: {
   56:   state_t state = conv->istate;
   57:   SPLIT_STATE;
   58:   int count = 0;
   59:   unsigned char c;
   60:   for (;;) {
   61:     c = *s;
   62:     if (c == ESC) {
   63:       if (n < count+3)
   64:         goto none;
   65:       if (s[1] == '(') {
   66:         if (s[2] == 'B') {
   67:           state1 = STATE_ASCII;
   68:           s += 3; count += 3;
   69:           if (n < count+1)
   70:             goto none;
   71:           continue;
   72:         }
   73:         if (s[2] == 'J') {
   74:           state1 = STATE_JISX0201ROMAN;
   75:           s += 3; count += 3;
   76:           if (n < count+1)
   77:             goto none;
   78:           continue;
   79:         }
   80:         if (s[2] == 'I') {
   81:           state1 = STATE_JISX0201KATAKANA;
   82:           s += 3; count += 3;
   83:           if (n < count+1)
   84:             goto none;
   85:           continue;
   86:         }
   87:         goto ilseq;
   88:       }
   89:       if (s[1] == '$') {
   90:         if (s[2] == '@' || s[2] == 'B') {
   91:           /* We don't distinguish JIS X 0208-1978 and JIS X 0208-1983. */
   92:           state1 = STATE_JISX0208;
   93:           s += 3; count += 3;
   94:           if (n < count+1)
   95:             goto none;
   96:           continue;
   97:         }
   98:         if (s[2] == 'A') {
   99:           state1 = STATE_GB2312;
  100:           s += 3; count += 3;
  101:           if (n < count+1)
  102:             goto none;
  103:           continue;
  104:         }
  105:         if (s[2] == '(') {
  106:           if (n < count+4)
  107:             goto none;
  108:           if (s[3] == 'D') {
  109:             state1 = STATE_JISX0212;
  110:             s += 4; count += 4;
  111:             if (n < count+1)
  112:               goto none;
  113:             continue;
  114:           }
  115:           if (s[3] == 'C') {
  116:             state1 = STATE_KSC5601;
  117:             s += 4; count += 4;
  118:             if (n < count+1)
  119:               goto none;
  120:             continue;
  121:           }
  122:           goto ilseq;
  123:         }
  124:         goto ilseq;
  125:       }
  126:       if (s[1] == '.') {
  127:         if (n < count+3)
  128:           goto none;
  129:         if (s[2] == 'A') {
  130:           state2 = STATE_G2_ISO8859_1;
  131:           s += 3; count += 3;
  132:           if (n < count+1)
  133:             goto none;
  134:           continue;
  135:         }
  136:         if (s[2] == 'F') {
  137:           state2 = STATE_G2_ISO8859_7;
  138:           s += 3; count += 3;
  139:           if (n < count+1)
  140:             goto none;
  141:           continue;
  142:         }
  143:         goto ilseq;
  144:       }
  145:       if (s[1] == 'N') {
  146:         switch (state2) {
  147:           case STATE_G2_NONE:
  148:             goto ilseq;
  149:           case STATE_G2_ISO8859_1:
  150:             if (s[2] < 0x80) {
  151:               unsigned char buf = s[2]+0x80;
  152:               int ret = iso8859_1_mbtowc(conv,pwc,&buf,1);
  153:               if (ret == RET_ILSEQ)
  154:                 goto ilseq;
  155:               if (ret != 1) abort();
  156:               COMBINE_STATE;
  157:               conv->istate = state;
  158:               return count+3;
  159:             } else
  160:               goto ilseq;
  161:           case STATE_G2_ISO8859_7:
  162:             if (s[2] < 0x80) {
  163:               unsigned char buf = s[2]+0x80;
  164:               int ret = iso8859_7_mbtowc(conv,pwc,&buf,1);
  165:               if (ret == RET_ILSEQ)
  166:                 goto ilseq;
  167:               if (ret != 1) abort();
  168:               COMBINE_STATE;
  169:               conv->istate = state;
  170:               return count+3;
  171:             } else
  172:               goto ilseq;
  173:           default: abort();
  174:         }
  175:       }
  176:       goto ilseq;
  177:     }
  178:     break;
  179:   }
  180:   switch (state1) {
  181:     case STATE_ASCII:
  182:       if (c < 0x80) {
  183:         int ret = ascii_mbtowc(conv,pwc,s,1);
  184:         if (ret == RET_ILSEQ)
  185:           goto ilseq;
  186:         if (ret != 1) abort();
  187:         if (*pwc == 0x000a || *pwc == 0x000d)
  188:           state2 = STATE_G2_NONE;
  189:         COMBINE_STATE;
  190:         conv->istate = state;
  191:         return count+1;
  192:       } else
  193:         goto ilseq;
  194:     case STATE_JISX0201ROMAN:
  195:       if (c < 0x80) {
  196:         int ret = jisx0201_mbtowc(conv,pwc,s,1);
  197:         if (ret == RET_ILSEQ)
  198:           goto ilseq;
  199:         if (ret != 1) abort();
  200:         if (*pwc == 0x000a || *pwc == 0x000d)
  201:           state2 = STATE_G2_NONE;
  202:         COMBINE_STATE;
  203:         conv->istate = state;
  204:         return count+1;
  205:       } else
  206:         goto ilseq;
  207:     case STATE_JISX0201KATAKANA:
  208:       if (c < 0x80) {
  209:         unsigned char buf = c+0x80;
  210:         int ret = jisx0201_mbtowc(conv,pwc,&buf,1);
  211:         if (ret == RET_ILSEQ)
  212:           goto ilseq;
  213:         if (ret != 1) abort();
  214:         COMBINE_STATE;
  215:         conv->istate = state;
  216:         return count+1;
  217:       } else
  218:         goto ilseq;
  219:     case STATE_JISX0208:
  220:       if (n < count+2)
  221:         goto none;
  222:       if (s[0] < 0x80 && s[1] < 0x80) {
  223:         int ret = jisx0208_mbtowc(conv,pwc,s,2);
  224:         if (ret == RET_ILSEQ)
  225:           goto ilseq;
  226:         if (ret != 2) abort();
  227:         COMBINE_STATE;
  228:         conv->istate = state;
  229:         return count+2;
  230:       } else
  231:         goto ilseq;
  232:     case STATE_JISX0212:
  233:       if (n < count+2)
  234:         goto none;
  235:       if (s[0] < 0x80 && s[1] < 0x80) {
  236:         int ret = jisx0212_mbtowc(conv,pwc,s,2);
  237:         if (ret == RET_ILSEQ)
  238:           goto ilseq;
  239:         if (ret != 2) abort();
  240:         COMBINE_STATE;
  241:         conv->istate = state;
  242:         return count+2;
  243:       } else
  244:         goto ilseq;
  245:     case STATE_GB2312:
  246:       if (n < count+2)
  247:         goto none;
  248:       if (s[0] < 0x80 && s[1] < 0x80) {
  249:         int ret = gb2312_mbtowc(conv,pwc,s,2);
  250:         if (ret == RET_ILSEQ)
  251:           goto ilseq;
  252:         if (ret != 2) abort();
  253:         COMBINE_STATE;
  254:         conv->istate = state;
  255:         return count+2;
  256:       } else
  257:         goto ilseq;
  258:     case STATE_KSC5601:
  259:       if (n < count+2)
  260:         goto none;
  261:       if (s[0] < 0x80 && s[1] < 0x80) {
  262:         int ret = ksc5601_mbtowc(conv,pwc,s,2);
  263:         if (ret == RET_ILSEQ)
  264:           goto ilseq;
  265:         if (ret != 2) abort();
  266:         COMBINE_STATE;
  267:         conv->istate = state;
  268:         return count+2;
  269:       } else
  270:         goto ilseq;
  271:     default: abort();
  272:   }
  273: 
  274: none:
  275:   COMBINE_STATE;
  276:   conv->istate = state;
  277:   return RET_TOOFEW(count);
  278: 
  279: ilseq:
  280:   COMBINE_STATE;
  281:   conv->istate = state;
  282:   return RET_SHIFT_ILSEQ(count);
  283: }
  284: 
  285: #undef COMBINE_STATE
  286: #undef SPLIT_STATE
  287: 
  288: /*
  289:  * The state can also contain one of the following values, << 16.
  290:  * Values >= STATE_TAG_LANGUAGE are temporary tag parsing states.
  291:  */
  292: #define STATE_TAG_NONE          0
  293: #define STATE_TAG_LANGUAGE      4
  294: #define STATE_TAG_LANGUAGE_j    5
  295: #define STATE_TAG_LANGUAGE_ja   1
  296: #define STATE_TAG_LANGUAGE_k    6
  297: #define STATE_TAG_LANGUAGE_ko   2
  298: #define STATE_TAG_LANGUAGE_z    7
  299: #define STATE_TAG_LANGUAGE_zh   3
  300: 
  301: #define SPLIT_STATE \
  302:   unsigned int state1 = state & 0xff, state2 = (state >> 8) & 0xff, state3 = state >> 16
  303: #define COMBINE_STATE \
  304:   state = (state3 << 16) | (state2 << 8) | state1
  305: 
  306: static int
  307: iso2022_jp2_wctomb (conv_t conv, unsigned char *r, ucs4_t wc, int n)
  308: {
  309:   state_t state = conv->ostate;
  310:   SPLIT_STATE;
  311:   unsigned char buf[2];
  312:   int ret;
  313:   /* This defines the conversion preferences depending on the current
  314:      langauge tag. */
  315:   enum conversion { none = 0, european, japanese, chinese, korean, other };
  316:   static const unsigned int conversion_lists[STATE_TAG_LANGUAGE] = {
  317:     /* STATE_TAG_NONE */
  318:     japanese + (european << 3) + (chinese << 6) + (korean << 9) + (other << 12),
  319:     /* STATE_TAG_LANGUAGE_ja */
  320:     japanese + (european << 3) + (chinese << 6) + (korean << 9) + (other << 12),
  321:     /* STATE_TAG_LANGUAGE_ko */
  322:     korean + (european << 3) + (japanese << 6) + (chinese << 9) + (other << 12),
  323:     /* STATE_TAG_LANGUAGE_zh */
  324:     chinese + (european << 3) + (japanese << 6) + (korean << 9) + (other << 12)
  325:   };
  326:   unsigned int conversion_list;
  327: 
  328:   /* Handle Unicode tag characters (range U+E0000..U+E007F). */
  329:   if ((wc >> 7) == (0xe0000 >> 7)) {
  330:     char c = wc & 0x7f;
  331:     if (c >= 'A' && c <= 'Z')
  332:       c += 'a'-'A';
  333:     switch (c) {
  334:       case 0x01:
  335:         state3 = STATE_TAG_LANGUAGE;
  336:         COMBINE_STATE;
  337:         conv->ostate = state;
  338:         return 0;
  339:       case 'j':
  340:         if (state3 == STATE_TAG_LANGUAGE) {
  341:           state3 = STATE_TAG_LANGUAGE_j;
  342:           COMBINE_STATE;
  343:           conv->ostate = state;
  344:           return 0;
  345:         }
  346:         break;
  347:       case 'a':
  348:         if (state3 == STATE_TAG_LANGUAGE_j) {
  349:           state3 = STATE_TAG_LANGUAGE_ja;
  350:           COMBINE_STATE;
  351:           conv->ostate = state;
  352:           return 0;
  353:         }
  354:         break;
  355:       case 'k':
  356:         if (state3 == STATE_TAG_LANGUAGE) {
  357:           state3 = STATE_TAG_LANGUAGE_k;
  358:           COMBINE_STATE;
  359:           conv->ostate = state;
  360:           return 0;
  361:         }
  362:         break;
  363:       case 'o':
  364:         if (state3 == STATE_TAG_LANGUAGE_k) {
  365:           state3 = STATE_TAG_LANGUAGE_ko;
  366:           COMBINE_STATE;
  367:           conv->ostate = state;
  368:           return 0;
  369:         }
  370:         break;
  371:       case 'z':
  372:         if (state3 == STATE_TAG_LANGUAGE) {
  373:           state3 = STATE_TAG_LANGUAGE_z;
  374:           COMBINE_STATE;
  375:           conv->ostate = state;
  376:           return 0;
  377:         }
  378:         break;
  379:       case 'h':
  380:         if (state3 == STATE_TAG_LANGUAGE_z) {
  381:           state3 = STATE_TAG_LANGUAGE_zh;
  382:           COMBINE_STATE;
  383:           conv->ostate = state;
  384:           return 0;
  385:         }
  386:         break;
  387:       case 0x7f:
  388:         state3 = STATE_TAG_NONE;
  389:         COMBINE_STATE;
  390:         conv->ostate = state;
  391:         return 0;
  392:       default:
  393:         break;
  394:     }
  395:     /* Other tag characters reset the tag parsing state or are ignored. */
  396:     if (state3 >= STATE_TAG_LANGUAGE)
  397:       state3 = STATE_TAG_NONE;
  398:     COMBINE_STATE;
  399:     conv->ostate = state;
  400:     return 0;
  401:   }
  402:   if (state3 >= STATE_TAG_LANGUAGE)
  403:     state3 = STATE_TAG_NONE;
  404: 
  405:   /* Try ASCII. */
  406:   ret = ascii_wctomb(conv,buf,wc,1);
  407:   if (ret != RET_ILUNI) {
  408:     if (ret != 1) abort();
  409:     if (buf[0] < 0x80) {
  410:       int count = (state1 == STATE_ASCII ? 1 : 4);
  411:       if (n < count)
  412:         return RET_TOOSMALL;
  413:       if (state1 != STATE_ASCII) {
  414:         r[0] = ESC;
  415:         r[1] = '(';
  416:         r[2] = 'B';
  417:         r += 3;
  418:         state1 = STATE_ASCII;
  419:       }
  420:       r[0] = buf[0];
  421:       if (wc == 0x000a || wc == 0x000d)
  422:         state2 = STATE_G2_NONE;
  423:       COMBINE_STATE;
  424:       conv->ostate = state;
  425:       return count;
  426:     }
  427:   }
  428: 
  429:   conversion_list = conversion_lists[state3];
  430: 
  431:   do {
  432:     switch (conversion_list & ((1 << 3) - 1)) {
  433: 
  434:       case european:
  435: 
  436:         /* Try ISO-8859-1. */
  437:         ret = iso8859_1_wctomb(conv,buf,wc,1);
  438:         if (ret != RET_ILUNI) {
  439:           if (ret != 1) abort();
  440:           if (buf[0] >= 0x80) {
  441:             int count = (state2 == STATE_G2_ISO8859_1 ? 3 : 6);
  442:             if (n < count)
  443:               return RET_TOOSMALL;
  444:             if (state2 != STATE_G2_ISO8859_1) {
  445:               r[0] = ESC;
  446:               r[1] = '.';
  447:               r[2] = 'A';
  448:               r += 3;
  449:               state2 = STATE_G2_ISO8859_1;
  450:             }
  451:             r[0] = ESC;
  452:             r[1] = 'N';
  453:             r[2] = buf[0]-0x80;
  454:             COMBINE_STATE;
  455:             conv->ostate = state;
  456:             return count;
  457:           }
  458:         }
  459: 
  460:         /* Try ISO-8859-7. */
  461:         ret = iso8859_7_wctomb(conv,buf,wc,1);
  462:         if (ret != RET_ILUNI) {
  463:           if (ret != 1) abort();
  464:           if (buf[0] >= 0x80) {
  465:             int count = (state2 == STATE_G2_ISO8859_7 ? 3 : 6);
  466:             if (n < count)
  467:               return RET_TOOSMALL;
  468:             if (state2 != STATE_G2_ISO8859_7) {
  469:               r[0] = ESC;
  470:               r[1] = '.';
  471:               r[2] = 'F';
  472:               r += 3;
  473:               state2 = STATE_G2_ISO8859_7;
  474:             }
  475:             r[0] = ESC;
  476:             r[1] = 'N';
  477:             r[2] = buf[0]-0x80;
  478:             COMBINE_STATE;
  479:             conv->ostate = state;
  480:             return count;
  481:           }
  482:         }
  483: 
  484:         break;
  485: 
  486:       case japanese:
  487: 
  488:         /* Try JIS X 0201-1976 Roman. */
  489:         ret = jisx0201_wctomb(conv,buf,wc,1);
  490:         if (ret != RET_ILUNI) {
  491:           if (ret != 1) abort();
  492:           if (buf[0] < 0x80) {
  493:             int count = (state1 == STATE_JISX0201ROMAN ? 1 : 4);
  494:             if (n < count)
  495:               return RET_TOOSMALL;
  496:             if (state1 != STATE_JISX0201ROMAN) {
  497:               r[0] = ESC;
  498:               r[1] = '(';
  499:               r[2] = 'J';
  500:               r += 3;
  501:               state1 = STATE_JISX0201ROMAN;
  502:             }
  503:             r[0] = buf[0];
  504:             if (wc == 0x000a || wc == 0x000d)
  505:               state2 = STATE_G2_NONE;
  506:             COMBINE_STATE;
  507:             conv->ostate = state;
  508:             return count;
  509:           }
  510:         }
  511: 
  512:         /* Try JIS X 0208-1990 in place of JIS X 0208-1978 and
  513:            JIS X 0208-1983. */
  514:         ret = jisx0208_wctomb(conv,buf,wc,2);
  515:         if (ret != RET_ILUNI) {
  516:           if (ret != 2) abort();
  517:           if (buf[0] < 0x80 && buf[1] < 0x80) {
  518:             int count = (state1 == STATE_JISX0208 ? 2 : 5);
  519:             if (n < count)
  520:               return RET_TOOSMALL;
  521:             if (state1 != STATE_JISX0208) {
  522:               r[0] = ESC;
  523:               r[1] = '$';
  524:               r[2] = 'B';
  525:               r += 3;
  526:               state1 = STATE_JISX0208;
  527:             }
  528:             r[0] = buf[0];
  529:             r[1] = buf[1];
  530:             COMBINE_STATE;
  531:             conv->ostate = state;
  532:             return count;
  533:           }
  534:         }
  535: 
  536:         /* Try JIS X 0212-1990. */
  537:         ret = jisx0212_wctomb(conv,buf,wc,2);
  538:         if (ret != RET_ILUNI) {
  539:           if (ret != 2) abort();
  540:           if (buf[0] < 0x80 && buf[1] < 0x80) {
  541:             int count = (state1 == STATE_JISX0212 ? 2 : 6);
  542:             if (n < count)
  543:               return RET_TOOSMALL;
  544:             if (state1 != STATE_JISX0212) {
  545:               r[0] = ESC;
  546:               r[1] = '$';
  547:               r[2] = '(';
  548:               r[3] = 'D';
  549:               r += 4;
  550:               state1 = STATE_JISX0212;
  551:             }
  552:             r[0] = buf[0];
  553:             r[1] = buf[1];
  554:             COMBINE_STATE;
  555:             conv->ostate = state;
  556:             return count;
  557:           }
  558:         }
  559: 
  560:         break;
  561: 
  562:       case chinese:
  563: 
  564:         /* Try GB 2312-1980. */
  565:         ret = gb2312_wctomb(conv,buf,wc,2);
  566:         if (ret != RET_ILUNI) {
  567:           if (ret != 2) abort();
  568:           if (buf[0] < 0x80 && buf[1] < 0x80) {
  569:             int count = (state1 == STATE_GB2312 ? 2 : 5);
  570:             if (n < count)
  571:               return RET_TOOSMALL;
  572:             if (state1 != STATE_GB2312) {
  573:               r[0] = ESC;
  574:               r[1] = '$';
  575:               r[2] = 'A';
  576:               r += 3;
  577:               state1 = STATE_GB2312;
  578:             }
  579:             r[0] = buf[0];
  580:             r[1] = buf[1];
  581:             COMBINE_STATE;
  582:             conv->ostate = state;
  583:             return count;
  584:           }
  585:         }
  586: 
  587:         break;
  588: 
  589:       case korean:
  590: 
  591:         /* Try KS C 5601-1992. */
  592:         ret = ksc5601_wctomb(conv,buf,wc,2);
  593:         if (ret != RET_ILUNI) {
  594:           if (ret != 2) abort();
  595:           if (buf[0] < 0x80 && buf[1] < 0x80) {
  596:             int count = (state1 == STATE_KSC5601 ? 2 : 6);
  597:             if (n < count)
  598:               return RET_TOOSMALL;
  599:             if (state1 != STATE_KSC5601) {
  600:               r[0] = ESC;
  601:               r[1] = '$';
  602:               r[2] = '(';
  603:               r[3] = 'C';
  604:               r += 4;
  605:               state1 = STATE_KSC5601;
  606:             }
  607:             r[0] = buf[0];
  608:             r[1] = buf[1];
  609:             COMBINE_STATE;
  610:             conv->ostate = state;
  611:             return count;
  612:           }
  613:         }
  614: 
  615:         break;
  616: 
  617:       case other:
  618: 
  619:         /* Try JIS X 0201-1976 Kana. This is not officially part of
  620:            ISO-2022-JP-2, according to RFC 1554. Therefore we try this
  621:            only after all other attempts. */
  622:         ret = jisx0201_wctomb(conv,buf,wc,1);
  623:         if (ret != RET_ILUNI) {
  624:           if (ret != 1) abort();
  625:           if (buf[0] >= 0x80) {
  626:             int count = (state1 == STATE_JISX0201KATAKANA ? 1 : 4);
  627:             if (n < count)
  628:               return RET_TOOSMALL;
  629:             if (state1 != STATE_JISX0201KATAKANA) {
  630:               r[0] = ESC;
  631:               r[1] = '(';
  632:               r[2] = 'I';
  633:               r += 3;
  634:               state1 = STATE_JISX0201KATAKANA;
  635:             }
  636:             r[0] = buf[0]-0x80;
  637:             COMBINE_STATE;
  638:             conv->ostate = state;
  639:             return count;
  640:           }
  641:         }
  642: 
  643:         break;
  644: 
  645:       default:
  646:         abort();
  647:     }
  648: 
  649:     conversion_list = conversion_list >> 3;
  650:   } while (conversion_list != 0);
  651: 
  652:   return RET_ILUNI;
  653: }
  654: 
  655: static int
  656: iso2022_jp2_reset (conv_t conv, unsigned char *r, int n)
  657: {
  658:   state_t state = conv->ostate;
  659:   SPLIT_STATE;
  660:   (void)state2;
  661:   (void)state3;
  662:   if (state1 != STATE_ASCII) {
  663:     if (n < 3)
  664:       return RET_TOOSMALL;
  665:     r[0] = ESC;
  666:     r[1] = '(';
  667:     r[2] = 'B';
  668:     /* conv->ostate = 0; will be done by the caller */
  669:     return 3;
  670:   } else
  671:     return 0;
  672: }
  673: 
  674: #undef COMBINE_STATE
  675: #undef SPLIT_STATE
  676: #undef STATE_TAG_LANGUAGE_zh
  677: #undef STATE_TAG_LANGUAGE_z
  678: #undef STATE_TAG_LANGUAGE_ko
  679: #undef STATE_TAG_LANGUAGE_k
  680: #undef STATE_TAG_LANGUAGE_ja
  681: #undef STATE_TAG_LANGUAGE_j
  682: #undef STATE_TAG_LANGUAGE
  683: #undef STATE_TAG_NONE
  684: #undef STATE_G2_ISO8859_7
  685: #undef STATE_G2_ISO8859_1
  686: #undef STATE_G2_NONE
  687: #undef STATE_KSC5601
  688: #undef STATE_GB2312
  689: #undef STATE_JISX0212
  690: #undef STATE_JISX0208
  691: #undef STATE_JISX0201KATAKANA
  692: #undef STATE_JISX0201ROMAN
  693: #undef STATE_ASCII

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>