--- /dev/null
+/*\r
+ * sbcs.c - routines to handle single-byte character sets.\r
+ */\r
+\r
+#include "charset.h"\r
+#include "internal.h"\r
+\r
+/*\r
+ * The charset_spec for any single-byte character set should\r
+ * provide read_sbcs() as its read function, and its `data' field\r
+ * should be a wchar_t string constant containing the 256 entries\r
+ * of the translation table.\r
+ */\r
+\r
+void read_sbcs(charset_spec const *charset, long int input_chr,\r
+ charset_state *state,\r
+ void (*emit)(void *ctx, long int output), void *emitctx)\r
+{\r
+ const struct sbcs_data *sd = charset->data;\r
+\r
+ UNUSEDARG(state);\r
+\r
+ emit(emitctx, sd->sbcs2ucs[input_chr]);\r
+}\r
+\r
+void write_sbcs(charset_spec const *charset, long int input_chr,\r
+ charset_state *state,\r
+ void (*emit)(void *ctx, long int output), void *emitctx)\r
+{\r
+ const struct sbcs_data *sd = charset->data;\r
+ int i, j, k, c;\r
+\r
+ UNUSEDARG(state);\r
+\r
+ /*\r
+ * Binary-search in the ucs2sbcs table.\r
+ */\r
+ i = -1;\r
+ j = sd->nvalid;\r
+ while (i+1 < j) {\r
+ k = (i+j)/2;\r
+ c = sd->ucs2sbcs[k];\r
+ if (input_chr < sd->sbcs2ucs[c])\r
+ j = k;\r
+ else if (input_chr > sd->sbcs2ucs[c])\r
+ i = k;\r
+ else {\r
+ emit(emitctx, c);\r
+ return;\r
+ }\r
+ }\r
+ emit(emitctx, ERROR);\r
+}\r