/* Can convert only english (ASCII) */ int _gnutls_ucs2_to_utf8(const void *data, size_t size, gnutls_datum_t * output, unsigned be) { unsigned int i, j; char *dst; const char *src = data; if (size == 0 || size % 2 != 0) return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST); dst = gnutls_malloc(size + 1); if (dst == NULL) return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR); for (i = j = 0; i < size; i += 2, j++) { if (src[i] != 0 || !c_isascii(src[i + 1])) return gnutls_assert_val(GNUTLS_E_PARSING_ERROR); if (be) dst[j] = src[i + 1]; else dst[j] = src[i]; } output->data = (void *) dst; output->size = j; output->data[output->size] = 0; return 0; }
bool is_ascii_string (const char *string) { for (; *string; string++) if (!c_isascii ((unsigned char) *string)) return false; return true; }
/* Returns 0 if the password is ok, or a negative error * code instead. */ static int _pkcs12_check_pass(const char *pass, size_t plen) { unsigned int i; for (i = 0; i < plen; i++) { if (c_isascii(pass[i])) continue; return GNUTLS_E_INVALID_PASSWORD; } return 0; }
static int make_printable_string(unsigned etype, const gnutls_datum_t * input, gnutls_datum_t * out) { int printable = 0; int ret; unsigned int i; if (etype == ASN1_ETYPE_BMP_STRING) { ret = _gnutls_ucs2_to_utf8(input->data, input->size, out, 1); if (ret < 0) { /* could not convert. Handle it as non-printable */ printable = 0; } else printable = 1; } else if (etype == ASN1_ETYPE_TELETEX_STRING) { int ascii = 0; /* HACK: if the teletex string contains only ascii * characters then treat it as printable. */ for (i = 0; i < input->size; i++) if (!c_isascii(input->data[i])) ascii = 1; if (ascii == 0) { out->data = gnutls_malloc(input->size + 1); if (out->data == NULL) return gnutls_assert_val (GNUTLS_E_MEMORY_ERROR); memcpy(out->data, input->data, input->size); out->size = input->size; out->data[out->size] = 0; printable = 1; } } else if (etype != ASN1_ETYPE_UNIVERSAL_STRING) /* supported but not printable */ return GNUTLS_E_INVALID_REQUEST; if (printable == 0) { /* need to allocate out */ ret = data2hex(input->data, input->size, out); if (ret < 0) { gnutls_assert(); return ret; } } return 0; }
/* Basic check of an encoding name. */ bool check_encoding_name (const char *encoding) { const char *s = encoding; while (*s) { if (!c_isascii (*s) || c_isspace (*s)) { logprintf (LOG_VERBOSE, _("Encoding %s isn't valid\n"), quote (encoding)); return false; } s++; } return true; }
/* Read the next Unicode UCS-4 character from the input file. */ static int phase2_getc () { if (phase2_pushback_length) return phase2_pushback[--phase2_pushback_length]; if (xgettext_current_source_encoding == po_charset_ascii) { int c = phase1_getc (); if (c == EOF) return UEOF; if (!c_isascii (c)) { multiline_error (xstrdup (""), xasprintf ("%s\n%s\n", non_ascii_error_message (lexical_context, real_file_name, line_number), _("\ Please specify the source encoding through --from-code or through a comment\n\ as specified in http://www.python.org/peps/pep-0263.html.\n"))); exit (EXIT_FAILURE); }
bool is_ascii_message (message_ty *mp) { const char *p = mp->msgstr; const char *p_end = p + mp->msgstr_len; for (; p < p_end; p++) if (!c_isascii ((unsigned char) *p)) return false; if (!is_ascii_string_list (mp->comment)) return false; if (!is_ascii_string_list (mp->comment_dot)) return false; /* msgid and msgid_plural are normally ASCII, so why checking? Because in complete UTF-8 environments they can be UTF-8, not ASCII. */ if (!is_ascii_string (mp->msgid)) return false; if (mp->msgid_plural != NULL && !is_ascii_string (mp->msgid_plural)) return false; return true; }
static void test_all (void) { int c; for (c = -0x80; c < 0x100; c++) { ASSERT (c_isascii (c) == (c >= 0 && c < 0x80)); switch (c) { case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': ASSERT (c_isalnum (c) == 1); break; default: ASSERT (c_isalnum (c) == 0); break; } switch (c) { case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': ASSERT (c_isalpha (c) == 1); break; default: ASSERT (c_isalpha (c) == 0); break; } switch (c) { case '\t': case ' ': ASSERT (c_isblank (c) == 1); break; default: ASSERT (c_isblank (c) == 0); break; } ASSERT (c_iscntrl (c) == ((c >= 0 && c < 0x20) || c == 0x7f)); switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': ASSERT (c_isdigit (c) == 1); break; default: ASSERT (c_isdigit (c) == 0); break; } switch (c) { case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': ASSERT (c_islower (c) == 1); break; default: ASSERT (c_islower (c) == 0); break; } ASSERT (c_isgraph (c) == ((c >= 0x20 && c < 0x7f) && c != ' ')); ASSERT (c_isprint (c) == (c >= 0x20 && c < 0x7f)); ASSERT (c_ispunct (c) == (c_isgraph (c) && !c_isalnum (c))); switch (c) { case ' ': case '\t': case '\n': case '\v': case '\f': case '\r': ASSERT (c_isspace (c) == 1); break; default: ASSERT (c_isspace (c) == 0); break; } switch (c) { case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': ASSERT (c_isupper (c) == 1); break; default: ASSERT (c_isupper (c) == 0); break; } switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': ASSERT (c_isxdigit (c) == 1); break; default: ASSERT (c_isxdigit (c) == 0); break; } switch (c) { case 'A': ASSERT (c_tolower (c) == 'a'); ASSERT (c_toupper (c) == c); break; case 'B': ASSERT (c_tolower (c) == 'b'); ASSERT (c_toupper (c) == c); break; case 'C': ASSERT (c_tolower (c) == 'c'); ASSERT (c_toupper (c) == c); break; case 'D': ASSERT (c_tolower (c) == 'd'); ASSERT (c_toupper (c) == c); break; case 'E': ASSERT (c_tolower (c) == 'e'); ASSERT (c_toupper (c) == c); break; case 'F': ASSERT (c_tolower (c) == 'f'); ASSERT (c_toupper (c) == c); break; case 'G': ASSERT (c_tolower (c) == 'g'); ASSERT (c_toupper (c) == c); break; case 'H': ASSERT (c_tolower (c) == 'h'); ASSERT (c_toupper (c) == c); break; case 'I': ASSERT (c_tolower (c) == 'i'); ASSERT (c_toupper (c) == c); break; case 'J': ASSERT (c_tolower (c) == 'j'); ASSERT (c_toupper (c) == c); break; case 'K': ASSERT (c_tolower (c) == 'k'); ASSERT (c_toupper (c) == c); break; case 'L': ASSERT (c_tolower (c) == 'l'); ASSERT (c_toupper (c) == c); break; case 'M': ASSERT (c_tolower (c) == 'm'); ASSERT (c_toupper (c) == c); break; case 'N': ASSERT (c_tolower (c) == 'n'); ASSERT (c_toupper (c) == c); break; case 'O': ASSERT (c_tolower (c) == 'o'); ASSERT (c_toupper (c) == c); break; case 'P': ASSERT (c_tolower (c) == 'p'); ASSERT (c_toupper (c) == c); break; case 'Q': ASSERT (c_tolower (c) == 'q'); ASSERT (c_toupper (c) == c); break; case 'R': ASSERT (c_tolower (c) == 'r'); ASSERT (c_toupper (c) == c); break; case 'S': ASSERT (c_tolower (c) == 's'); ASSERT (c_toupper (c) == c); break; case 'T': ASSERT (c_tolower (c) == 't'); ASSERT (c_toupper (c) == c); break; case 'U': ASSERT (c_tolower (c) == 'u'); ASSERT (c_toupper (c) == c); break; case 'V': ASSERT (c_tolower (c) == 'v'); ASSERT (c_toupper (c) == c); break; case 'W': ASSERT (c_tolower (c) == 'w'); ASSERT (c_toupper (c) == c); break; case 'X': ASSERT (c_tolower (c) == 'x'); ASSERT (c_toupper (c) == c); break; case 'Y': ASSERT (c_tolower (c) == 'y'); ASSERT (c_toupper (c) == c); break; case 'Z': ASSERT (c_tolower (c) == 'z'); ASSERT (c_toupper (c) == c); break; case 'a': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'A'); break; case 'b': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'B'); break; case 'c': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'C'); break; case 'd': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'D'); break; case 'e': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'E'); break; case 'f': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'F'); break; case 'g': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'G'); break; case 'h': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'H'); break; case 'i': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'I'); break; case 'j': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'J'); break; case 'k': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'K'); break; case 'l': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'L'); break; case 'm': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'M'); break; case 'n': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'N'); break; case 'o': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'O'); break; case 'p': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'P'); break; case 'q': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'Q'); break; case 'r': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'R'); break; case 's': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'S'); break; case 't': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'T'); break; case 'u': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'U'); break; case 'v': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'V'); break; case 'w': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'W'); break; case 'x': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'X'); break; case 'y': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'Y'); break; case 'z': ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == 'Z'); break; default: ASSERT (c_tolower (c) == c); ASSERT (c_toupper (c) == c); break; } } }
static void * format_parse (const char *format, bool translated, char **invalid_reason) { struct spec spec; struct spec *result; spec.directives = 0; spec.named_arg_count = 0; spec.allocated = 0; spec.named = NULL; for (; *format != '\0';) if (*format++ == '$') { /* A variable substitution. */ char *name; spec.directives++; if (*format == '{') { const char *name_start; const char *name_end; size_t n; name_start = ++format; for (; *format != '\0'; format++) { if (*format == '}') break; if (!c_isascii (*format)) { *invalid_reason = INVALID_NON_ASCII_VARIABLE (); goto bad_format; } if (format > name_start && (*format == '-' || *format == '=' || *format == '+' || *format == '?' || *format == ':')) { *invalid_reason = INVALID_SHELL_SYNTAX (); goto bad_format; } if (!(c_isalnum (*format) || *format == '_') || (format == name_start && c_isdigit (*format))) { *invalid_reason = INVALID_CONTEXT_DEPENDENT_VARIABLE (); goto bad_format; } } if (*format == '\0') { *invalid_reason = INVALID_UNTERMINATED_DIRECTIVE (); goto bad_format; } name_end = format++; n = name_end - name_start; if (n == 0) { *invalid_reason = INVALID_EMPTY_VARIABLE (); goto bad_format; } name = (char *) xmalloc (n + 1); memcpy (name, name_start, n); name[n] = '\0'; } else if (c_isalpha (*format) || *format == '_') { const char *name_start; const char *name_end; size_t n; name_start = format; do format++; while (*format != '\0' && (c_isalnum (*format) || *format == '_')); name_end = format; n = name_end - name_start; name = (char *) xmalloc (n + 1); memcpy (name, name_start, n); name[n] = '\0'; } else if (*format != '\0') { if (!c_isascii (*format)) { *invalid_reason = INVALID_NON_ASCII_VARIABLE (); goto bad_format; } else { *invalid_reason = INVALID_CONTEXT_DEPENDENT_VARIABLE (); goto bad_format; } } else { *invalid_reason = INVALID_UNTERMINATED_DIRECTIVE (); goto bad_format; } /* Named argument. */ if (spec.allocated == spec.named_arg_count) { spec.allocated = 2 * spec.allocated + 1; spec.named = (struct named_arg *) xrealloc (spec.named, spec.allocated * sizeof (struct named_arg)); } spec.named[spec.named_arg_count].name = name; spec.named_arg_count++; } /* Sort the named argument array, and eliminate duplicates. */ if (spec.named_arg_count > 1) { unsigned int i, j; qsort (spec.named, spec.named_arg_count, sizeof (struct named_arg), named_arg_compare); /* Remove duplicates: Copy from i to j, keeping 0 <= j <= i. */ for (i = j = 0; i < spec.named_arg_count; i++) if (j > 0 && strcmp (spec.named[i].name, spec.named[j-1].name) == 0) free (spec.named[i].name); else { if (j < i) spec.named[j].name = spec.named[i].name; j++; } spec.named_arg_count = j; } result = (struct spec *) xmalloc (sizeof (struct spec)); *result = spec; return result; bad_format: if (spec.named != NULL) { unsigned int i; for (i = 0; i < spec.named_arg_count; i++) free (spec.named[i].name); free (spec.named); } return NULL; }