コード例 #1
0
ファイル: utf16.c プロジェクト: mickelfeng/regexp
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);
    }
}
コード例 #2
0
ファイル: dirent.c プロジェクト: julp/ugrep
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;
}