void file_setSize(FileHandle* h, size_t neededSize) { size_t fileSize = file_getSize(h); h->file = freopen(NULL, "ab", h->file); for (; fileSize<neededSize; fileSize++) fputc(0, h->file); h->file = freopen(NULL, h->flags, h->file); }
bool readConfigFile() { FileHandle* file = file_open(INI_PATH, "r"); char line[100]; void (*configParser)(char*) = generalParseConfig; if (file == NULL) goto end; while (file_tell(file) < file_getSize(file)) { file_gets(line, 100, file); char c=0; while (*line != '\0' && ((c = line[strlen(line)-1]) == ' ' || c == '\n' || c == '\r')) line[strlen(line)-1] = '\0'; if (line[0] == '[') { char* endBrace; if ((endBrace = strrchr(line, ']')) != 0) { *endBrace = '\0'; const char* section = line+1; if (strcasecmp(section, "general") == 0) { configParser = generalParseConfig; } else if (strcasecmp(section, "console") == 0) { configParser = menuParseConfig; } else if (strcasecmp(section, "controls") == 0) { configParser = controlsParseConfig; } } } else configParser(line); } file_close(file); end: controlsCheckConfig(); return file != NULL; }
static void diskcache_retrieveThread(void *userdata) { struct diskcache_RetrieveThreadInfo *rti = userdata; // peek on file size: size_t size = file_getSize(rti->resourcepath); // open file for reading with proper file locking: FILE *f = diskcache_openLockedFile(rti->resourcepath, 0); if (!f) { // we couldn't open the file. rti->callback(NULL, 0, rti->userdata); free(rti->resourcepath); free(rti); return; } // see if file size has changed until we got that lock: size_t newsize = file_getSize(rti->resourcepath); if (newsize < size) { // we don't like shrinking files. // is it just being deleted? diskcache_closeLockedFile(f); rti->callback(NULL, 0, rti->userdata); free(rti->resourcepath); free(rti); return; } size = newsize; // allocate data buffer: char *data = malloc(size); if (!data) { // no point in continuing. diskcache_closeLockedFile(f); rti->callback(NULL, 0, rti->userdata); free(rti->resourcepath); free(rti); return; } // read data: if (fread(data, 1, size, f) != size) { // failed to read all (any?) data. diskcache_closeLockedFile(f); rti->callback(NULL, 0, rti->userdata); free(rti->resourcepath); free(rti); free(data); return; } // close file: diskcache_closeLockedFile(f); // issue callback: rti->callback(data, size, rti->userdata); // free resources: free(rti->resourcepath); free(rti); }
int main(int argc, char** argv) { unsigned char* pucBuf = NULL; int nBufSize = 512; int nReadFileSize = 0; int nWriteCycleBufSize = 0; pthread_t tid = -1; int nSum = 0; CYCLEBUFFERCXT_S* psCycBufCxt = createCycleBuffer(CYCLEBUFFERLEN); if (NULL == psCycBufCxt) { printf("createCycleBuffer failed!\n"); return -1; } if (0 != initCycleBuffer(psCycBufCxt, 0, 0)) { printf("initCycleBuffer failed!\n"); return -1; } nFd = file_open_rw(AUDIOFILEPATH); if (-1 == nFd) { printf("file_open_rw failed!\n"); if (NULL != psCycBufCxt) destroyCycleBuffer(psCycBufCxt); return -1; } originFileSize = file_getSize(nFd); printf("%s size is %d\n", AUDIOFILEPATH, originFileSize); pucBuf = (unsigned char*)malloc(sizeof(unsigned char)*nBufSize); if (NULL == pucBuf) { printf("file_open_rw failed!\n"); if (NULL != psCycBufCxt) destroyCycleBuffer(psCycBufCxt); file_close(nFd); return -1; } if (0 != pthread_create(&tid, NULL, doThread, (void*)psCycBufCxt)) { printf("create pthread failed!\n"); if (NULL != psCycBufCxt) destroyCycleBuffer(psCycBufCxt); file_close(nFd); return -1; } while(1) { nReadFileSize = file_read(nFd, pucBuf, nBufSize); nWriteCycleBufSize = writeCycleBuffer(psCycBufCxt, pucBuf, nReadFileSize); if (-1 == nWriteCycleBufSize) { printf("writeCycleBuffer failed!\n"); } printf("write cycle buffer nWriteCycleBufSize=%d\n", nWriteCycleBufSize); nSum += nReadFileSize; if (nSum == originFileSize) break; sleep(1); } printf("read file over!\n"); pthread_join(tid, NULL); if (NULL != psCycBufCxt) destroyCycleBuffer(psCycBufCxt); file_close(nFd); return 0; }