aboutsummaryrefslogtreecommitdiff
path: root/binutils/winduni.c
diff options
context:
space:
mode:
authorKai Tietz <kai.tietz@onevision.com>2011-10-25 08:03:18 +0000
committerKai Tietz <kai.tietz@onevision.com>2011-10-25 08:03:18 +0000
commit81472056d738c3b07914f3dad5edb0f4af45a050 (patch)
tree3273d71c8c4bf457ccf5ba1bcbfda3792f41a151 /binutils/winduni.c
parent977888b9906f450cc0f3f2ecf917e7b33aaf1217 (diff)
downloadgdb-81472056d738c3b07914f3dad5edb0f4af45a050.zip
gdb-81472056d738c3b07914f3dad5edb0f4af45a050.tar.gz
gdb-81472056d738c3b07914f3dad5edb0f4af45a050.tar.bz2
2011-10-25 Kai Tietz <ktietz@redhat.com>
* winduni.h (unicode_from_ascii_len): New prototype. * winduni.c (unicode_from_ascii_len): New function. * windres.h (define_stringtable): Add additional length argument. * windres.c (define_stringtable): Add length argument for string. * rcparse.y (res_unicode_sizedstring): New rule. (res_unicode_sizedstring_concat): Likewise. (string_data): Adjust rule. 2011-10-25 Kai Tietz <ktietz@redhat.com> * binutils-all/windres/strtab4.rc: New test. * binutils-all/windres/strtab4.rsd: Likewise.
Diffstat (limited to 'binutils/winduni.c')
-rw-r--r--binutils/winduni.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/binutils/winduni.c b/binutils/winduni.c
index 572145e..76404ca 100644
--- a/binutils/winduni.c
+++ b/binutils/winduni.c
@@ -194,6 +194,94 @@ unicode_from_ascii (rc_uint_type *length, unichar **unicode, const char *ascii)
unicode_from_codepage (length, unicode, ascii, wind_current_codepage);
}
+/* Convert an ASCII string with length A_LENGTH to a unicode string. We just
+ copy it, expanding chars to shorts, rather than doing something intelligent.
+ This routine converts also \0 within a string. */
+
+void
+unicode_from_ascii_len (rc_uint_type *length, unichar **unicode, const char *ascii, rc_uint_type a_length)
+{
+ char *tmp, *p;
+ rc_uint_type tlen, elen, idx = 0;
+
+ *unicode = NULL;
+
+ if (!a_length)
+ {
+ if (length)
+ *length = 0;
+ return;
+ }
+
+ /* Make sure we have zero terminated string. */
+ p = tmp = (char *) alloca (a_length + 1);
+ memcpy (tmp, ascii, a_length);
+ tmp[a_length] = 0;
+
+ while (a_length > 0)
+ {
+ unichar *utmp, *up;
+
+ tlen = strlen (p);
+
+ if (tlen > a_length)
+ tlen = a_length;
+ if (*p == 0)
+ {
+ /* Make room for one more character. */
+ utmp = (unichar *) res_alloc (sizeof (unichar) * (idx + 1));
+ if (idx > 0)
+ {
+ memcpy (utmp, *unicode, idx * sizeof (unichar));
+ }
+ *unicode = utmp;
+ utmp[idx++] = 0;
+ --a_length;
+ p++;
+ continue;
+ }
+ utmp = NULL;
+ elen = 0;
+ elen = wind_MultiByteToWideChar (wind_current_codepage, p, NULL, 0);
+ if (elen)
+ {
+ utmp = ((unichar *) res_alloc (elen + sizeof (unichar) * 2));
+ wind_MultiByteToWideChar (wind_current_codepage, p, utmp, elen);
+ elen /= sizeof (unichar);
+ elen --;
+ }
+ else
+ {
+ /* Make room for one more character. */
+ utmp = (unichar *) res_alloc (sizeof (unichar) * (idx + 1));
+ if (idx > 0)
+ {
+ memcpy (utmp, *unicode, idx * sizeof (unichar));
+ }
+ *unicode = utmp;
+ utmp[idx++] = ((unichar) *p) & 0xff;
+ --a_length;
+ p++;
+ continue;
+ }
+ p += tlen;
+ a_length -= tlen;
+
+ up = (unichar *) res_alloc (sizeof (unichar) * (idx + elen));
+ if (idx > 0)
+ memcpy (up, *unicode, idx * sizeof (unichar));
+
+ *unicode = up;
+ if (elen)
+ memcpy (&up[idx], utmp, sizeof (unichar) * elen);
+
+ idx += elen;
+ }
+
+ if (length)
+ *length = idx;
+}
+
/* Convert an unicode string to an ASCII string. We just copy it,
shrink shorts to chars, rather than doing something intelligent.
Shorts with not within the char range are replaced by '_'. */