void utf16_normalize(UChar **target, int32_t *target_len, const UChar *src, int32_t src_len, UNormalizationMode nm, UErrorCode *status) { *status = U_ZERO_ERROR; if (nm < UNORM_NONE || nm >= UNORM_MODE_COUNT) { *status = U_ILLEGAL_ARGUMENT_ERROR; return; } if (UNORM_NONE == nm) { *target = (UChar *) src; *target_len = src_len; return; } *target_len = unorm_normalize(src, src_len, nm, 0, NULL, 0, status); if (U_BUFFER_OVERFLOW_ERROR != *status) { return; } *status = U_ZERO_ERROR; *target = mem_new_n(**target, *target_len + 1); /* *target_len = */unorm_normalize(src, src_len, nm, 0, *target, *target_len + 1, status); if (U_FAILURE(*status)) { efree(*target); *target = NULL; *target_len = 0; } else { *(*target + *target_len) = '\0'; assert(U_ZERO_ERROR == *status); } }
DIR *opendir(void *x, const char *filename) { DIR *dp; char *filespec; struct _stat buffer; int index, fd, allocated; if (-1 == (fd = win32_open_ex(x, filename, _O_RDONLY, &buffer))) { return NULL; } if (!S_ISDIR(buffer.st_mode)) { errno = ENOTDIR; return NULL; } allocated = strlen(filename) + 2 + 1; filespec = mem_new_n(*filename, allocated); if (0 != strcpy_s(filespec, allocated, filename)) { free(filespec); return NULL; } index = strlen(filespec) - 1; if (index >= 0 && (filespec[index] == '/' || (filespec[index] == '\\' && (index == 0 || !IsDBCSLeadByte(filespec[index-1]))))) { filespec[index] = '\0'; } if (0 != strncat_s(filespec, allocated, "\\*", sizeof("\\*") - 1)) { free(filespec); return NULL; } dp = mem_new(*dp); dp->offset = 0; dp->finished = 0; if ((dp->handle = FindFirstFileA(filespec, &(dp->fileinfo))) == INVALID_HANDLE_VALUE) { DWORD err = GetLastError(); if (err == ERROR_NO_MORE_FILES || err == ERROR_FILE_NOT_FOUND) { dp->finished = 1; } else { free(dp); free(filespec); win32_close(x, fd); return NULL; } } dp->fd = fd; dp->dir = mem_dup(filename); free(filespec); return dp; }