예제 #1
0
int gu_decompress(const char *filename_in, const char *filename_out)
{
    FILE *f = NULL;
    void *dst = NULL;
    long size = 0;
    int ret = 0;

    if (0 != (ret = gu_decompress_file_to_mem(filename_in, &dst, &size))) {
        return ret;
    }

    if (NULL == (f = fopen(filename_out, "wb"))) {
        free(dst);
        return 1;
    }

    fwrite(dst, size, 1, f);

    free(dst);
    fclose(f);

    return 0;
}
예제 #2
0
파일: h3mlib.c 프로젝트: Dergash/homm3tools
int h3m_get_filename_from_gm1(const char *filename_gm1, char *filename_h3m,
    size_t n)
{
    unsigned char *buf = NULL;
    long buf_size = 0;
    size_t len = 0;
    unsigned char *loc = NULL;

    if (0 != gu_decompress_file_to_mem(filename_gm1, (void **)&buf, &buf_size)) {
        return 1;
    }

    if (NULL == (loc = memmem(buf, (size_t)buf_size, (uint8_t *)".h3m", sizeof(".h3m") - 1))) {
        gu_free(buf);
        return 2;
    }

    while (((isalnum(*(loc - 1))) || (isspace(*(loc - 1)))
            || (ispunct(*(loc - 1)))
            || ('(' == *(loc - 1)) || ('(' == *(loc - 1))
            || ('_' == *(loc - 1)))
        && loc > buf) {
        --loc;
    }

    if (n <= (len = strlen((char *)loc))) {
        gu_free(buf);
        return 3;
    }

    strcpy(filename_h3m, (char *)loc);

    gu_free(buf);

    return 0;
}