Having painstakingly generated those reverse mapping tables in
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Wed, 1 Jan 2003 17:03:27 +0000 (17:03 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Wed, 1 Jan 2003 17:03:27 +0000 (17:03 +0000)
sbcsdat.c, it would seem a shame not to actually use them. Ahem.
Thanks to Ben, without whose checkin in this area I'd have forgotten
completely :-)

git-svn-id: svn://svn.tartarus.org/sgt/putty@2404 cda61777-01e9-0310-a592-d414129be87e

charset/sbcs.c

index c92bdea..8e2a227 100644 (file)
@@ -28,18 +28,26 @@ void write_sbcs(charset_spec const *charset, long int input_chr,
                void (*emit)(void *ctx, long int output), void *emitctx)
 {
     const struct sbcs_data *sd = charset->data;
-    int i;
+    int i, j, k, c;
 
     UNUSEDARG(state);
 
     /*
-     * FIXME: this should work, but it's ludicrously inefficient.
-     * We should be using the ucs2sbcs table.
+     * Binary-search in the ucs2sbcs table.
      */
-    for (i = 0; i < 256; i++)
-       if (sd->sbcs2ucs[i] == input_chr) {
-           emit(emitctx, i);
+    i = -1;
+    j = sd->nvalid;
+    while (i+1 < j) {
+       k = (i+j)/2;
+       c = sd->ucs2sbcs[k];
+       if (input_chr < sd->sbcs2ucs[c])
+           j = k;
+       else if (input_chr > sd->sbcs2ucs[c])
+           i = k;
+       else {
+           emit(emitctx, c);
            return;
        }
+    }
     emit(emitctx, ERROR);
 }