/** * stringprep - prepare internationalized string * @in: input/ouput array with string to prepare. * @maxlen: maximum length of input/output array. * @flags: a #Stringprep_profile_flags value, or 0. * @profile: pointer to #Stringprep_profile to use. * * Prepare the input zero terminated UTF-8 string according to the * stringprep profile, and write back the result to the input string. * * Note that you must convert strings entered in the systems locale * into UTF-8 before using this function, see * stringprep_locale_to_utf8(). * * Since the stringprep operation can expand the string, @maxlen * indicate how large the buffer holding the string is. This function * will not read or write to characters outside that size. * * The @flags are one of #Stringprep_profile_flags values, or 0. * * The @profile contain the #Stringprep_profile instructions to * perform. Your application can define new profiles, possibly * re-using the generic stringprep tables that always will be part of * the library, or use one of the currently supported profiles. * * Return value: Returns %STRINGPREP_OK iff successful, or an error code. **/ int stringprep (char *in, size_t maxlen, Stringprep_profile_flags flags, const Stringprep_profile * profile) { int rc; char *utf8 = NULL; uint32_t *ucs4 = NULL; size_t ucs4len, maxucs4len, adducs4len = 50; do { uint32_t *newp; if (ucs4) free (ucs4); ucs4 = stringprep_utf8_to_ucs4 (in, -1, &ucs4len); maxucs4len = ucs4len + adducs4len; newp = realloc (ucs4, maxucs4len * sizeof (uint32_t)); if (!newp) { free (ucs4); return STRINGPREP_MALLOC_ERROR; } ucs4 = newp; rc = stringprep_4i (ucs4, &ucs4len, maxucs4len, flags, profile); adducs4len += 50; } while (rc == STRINGPREP_TOO_SMALL_BUFFER); if (rc != STRINGPREP_OK) { free (ucs4); return rc; } utf8 = stringprep_ucs4_to_utf8 (ucs4, ucs4len, 0, 0); free (ucs4); if (!utf8) return STRINGPREP_MALLOC_ERROR; if (strlen (utf8) >= maxlen) { free (utf8); return STRINGPREP_TOO_SMALL_BUFFER; } strcpy (in, utf8); /* flawfinder: ignore */ free (utf8); return STRINGPREP_OK; }
static int stringprep_4zi_1 (uint32_t * ucs4, size_t ucs4len, size_t maxucs4len, Stringprep_profile_flags flags, const Stringprep_profile * profile) { int rc; rc = stringprep_4i (ucs4, &ucs4len, maxucs4len, flags, profile); if (rc != STRINGPREP_OK) return rc; if (ucs4len >= maxucs4len) return STRINGPREP_TOO_SMALL_BUFFER; ucs4[ucs4len] = 0; return STRINGPREP_OK; }