const local_iconv_map * wind_find_codepage_info (unsigned cp) { #if !defined (_WIN32) && !defined (__CYGWIN__) int i; for (i = 0; codepages[i].codepage != (rc_uint_type) -1 && codepages[i].codepage != cp; i++) ; if (codepages[i].codepage == (rc_uint_type) -1) return NULL; return &codepages[i]; #else static local_iconv_map lim; if (!unicode_is_valid_codepage (cp)) return NULL; lim.codepage = cp; lim.iconv_name = ""; return & lim; #endif }
static void cpp_line (void) { const char *s = rclex_tok; int line; char *send, *fn; size_t len, mlen; ++s; while (ISSPACE (*s)) ++s; /* Check for #pragma code_page ( DEFAULT | <nr>). */ len = strlen (s); mlen = strlen ("pragma"); if (len > mlen && memcmp (s, "pragma", mlen) == 0 && ISSPACE (s[mlen])) { const char *end; s += mlen + 1; while (ISSPACE (*s)) ++s; len = strlen (s); mlen = strlen ("code_page"); if (len <= mlen || memcmp (s, "code_page", mlen) != 0) /* FIXME: We ought to issue a warning message about an unrecognised pragma. */ return; s += mlen; while (ISSPACE (*s)) ++s; if (*s != '(') /* FIXME: We ought to issue an error message about a malformed pragma. */ return; ++s; while (ISSPACE (*s)) ++s; if (*s == 0 || (end = strchr (s, ')')) == NULL) /* FIXME: We ought to issue an error message about a malformed pragma. */ return; len = (size_t) (end - s); fn = xmalloc (len + 1); if (len) memcpy (fn, s, len); fn[len] = 0; while (len > 0 && (fn[len - 1] > 0 && fn[len - 1] <= 0x20)) fn[--len] = 0; if (! len || (len == strlen ("DEFAULT") && strcasecmp (fn, "DEFAULT") == 0)) wind_current_codepage = wind_default_codepage; else if (len > 0) { rc_uint_type ncp; if (fn[0] == '0' && (fn[1] == 'x' || fn[1] == 'X')) ncp = (rc_uint_type) strtol (fn + 2, NULL, 16); else ncp = (rc_uint_type) strtol (fn, NULL, 10); if (ncp == CP_UTF16 || ! unicode_is_valid_codepage (ncp)) fatal (_("invalid value specified for pragma code_page.\n")); wind_current_codepage = ncp; } free (fn); return; } line = strtol (s, &send, 0); if (*send != '\0' && ! ISSPACE (*send)) return; /* Subtract 1 because we are about to count the newline. */ rc_lineno = line - 1; s = send; while (ISSPACE (*s)) ++s; if (*s != '"') return; ++s; send = strchr (s, '"'); if (send == NULL) return; fn = xmalloc (send - s + 1); strncpy (fn, s, send - s); fn[send - s] = '\0'; free (rc_filename); rc_filename = fn; if (! initial_fn) { initial_fn = xmalloc (strlen (fn) + 1); strcpy (initial_fn, fn); } /* Allow the initial file, regardless of name. Suppress all other files if they end in ".h" (this allows included "*.rc"). */ if (strcmp (initial_fn, fn) == 0 || strcmp (fn + strlen (fn) - 2, ".h") != 0) suppress_cpp_data = 0; else suppress_cpp_data = 1; }