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; }
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; }