Stony Brook index page Stony Brook Modula-2 archive and support pages

Home - News - Tips & Tricks - Library Fixes - Bugs workarounds - SB site archive

AnsiToUnicode and UnicodeToAnsi in ExStrings Module

Frank Schoonjans, July 21, 2006

At (about) line 366 of the ExStrings implementation module the WIN32 versions of the AnsiToUnicode and UnicodeToAnsi procedures are implemented as follows:

PROCEDURE AnsiToUnicode(strA : ARRAY OF ACHAR; VAR OUT strU : ARRAY OF UCHAR);
VAR
    l   : CARDINAL;
BEGIN
    l := LENGTH(strA);
    IF WINNLS.MultiByteToWideChar(WINNLS.CP_ACP,
                                  0,
                                  strA, l,
                                  strU, HIGH(strU)+1) = 0
    THEN
        l := 0;
    END;
    IF l <= HIGH(strU) THEN
        strU[l] := '';
    END;
END AnsiToUnicode;

PROCEDURE UnicodeToAnsi(strU : ARRAY OF UCHAR;
                        VAR OUT strA : ARRAY OF ACHAR;
                        replaceChar : ACHAR);
VAR
    l           : CARDINAL;
    replaced    : BOOL;
BEGIN
    l := LENGTH(strU);
    IF WINNLS.WideCharToMultiByte(WINNLS.CP_ACP,
                                  0,
                                  strU, l,
                                  strA, HIGH(strA)+1,
                                  replaceChar,
                                  replaced) = 0
    THEN
        l := 0;
    END;
    IF l <= HIGH(strA) THEN
        strA[l] := '';
    END;
END UnicodeToAnsi;

This should be corrected as follows:

PROCEDURE AnsiToUnicode(strA : ARRAY OF ACHAR; VAR OUT strU : ARRAY OF UCHAR);
VAR
    l   : CARDINAL;
BEGIN
    l := WINNLS.MultiByteToWideChar(WINNLS.CP_ACP,
                                  0,
                                  strA, LENGTH(strA),
                                  strU, HIGH(strU)+1);
    IF l <= HIGH(strU) THEN
        strU[l] := '';
    END;
END AnsiToUnicode;

PROCEDURE UnicodeToAnsi(strU : ARRAY OF UCHAR;
                        VAR OUT strA : ARRAY OF ACHAR;
                        replaceChar : ACHAR);
VAR
    l           : CARDINAL;
    replaced    : BOOL;
BEGIN
    l := WINNLS.WideCharToMultiByte(WINNLS.CP_ACP,
                                  0,
                                  strU, LENGTH(strU),
                                  strA, HIGH(strA)+1,
                                  replaceChar,
                                  replaced);
    IF l <= HIGH(strA) THEN
        strA[l] := '';
    END;
END UnicodeToAnsi;