+ unsigned long x;
+ size_t no_read_sub = 0;
+ int mode = *inp < 128 ? cd->g0_mode : cd->g1_mode;
+ *comb = 0;
+
+ switch(mode)
+ {
+ case 'B': /* Basic ASCII */
+ case 's': /* ASCII */
+ x = yaz_marc8_42_conv(inp, inbytesleft, &no_read_sub, comb, 127, 0);
+ break;
+ case 'E': /* ANSEL */
+ x = yaz_marc8_45_conv(inp, inbytesleft, &no_read_sub, comb, 127, 128);
+ break;
+ case 'g': /* Greek */
+ x = yaz_marc8_67_conv(inp, inbytesleft, &no_read_sub, comb, 127, 0);
+ break;
+ case 'b': /* Subscripts */
+ x = yaz_marc8_62_conv(inp, inbytesleft, &no_read_sub, comb, 127, 0);
+ break;
+ case 'p': /* Superscripts */
+ x = yaz_marc8_70_conv(inp, inbytesleft, &no_read_sub, comb, 127, 0);
+ break;
+ case '2': /* Basic Hebrew */
+ x = yaz_marc8_32_conv(inp, inbytesleft, &no_read_sub, comb, 127, 0);
+ break;
+ case 'N': /* Basic Cyrillic */
+ x = yaz_marc8_4E_conv(inp, inbytesleft, &no_read_sub, comb, 127, 0);
+ break;
+ case 'Q': /* Extended Cyrillic */
+ x = yaz_marc8_51_conv(inp, inbytesleft, &no_read_sub, comb, 127, 0);
+ break;
+ case '3': /* Basic Arabic */
+ x = yaz_marc8_33_conv(inp, inbytesleft, &no_read_sub, comb, 127, 0);
+ break;
+ case '4': /* Extended Arabic */
+ x = yaz_marc8_34_conv(inp, inbytesleft, &no_read_sub, comb, 127, 0);
+ break;
+ case 'S': /* Greek */
+ x = yaz_marc8_53_conv(inp, inbytesleft, &no_read_sub, comb, 127, 0);
+ break;
+ case '1': /* Chinese, Japanese, Korean (EACC) */
+ x = yaz_marc8_31_conv(inp, inbytesleft, &no_read_sub, comb, 127, 0);
+ break;
+ default:
+ *no_read = 0;
+ cd->my_errno = YAZ_ICONV_EILSEQ;
+ return 0;
+ }
+ *no_read += no_read_sub;
+ return x;