X-Git-Url: http://git.wpitchoune.net/gitweb/?a=blobdiff_plain;f=src%2Fio.c;h=f6d87542c281da082b8b49b70e8440ecc8ba55cd;hb=301be453975067183367ea8c29069476bf1b45ff;hp=a7c46af213306a4291d753ca07383cb7062f90c9;hpb=eab64e6ecb435face78646153fe86c22895d8f41;p=ppastats.git diff --git a/src/io.c b/src/io.c index a7c46af..f6d8754 100644 --- a/src/io.c +++ b/src/io.c @@ -1,11 +1,11 @@ /* - * Copyright (C) 2011 jeanfi@gmail.com + * Copyright (C) 2011-2012 jeanfi@gmail.com * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. - + * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU @@ -27,7 +27,7 @@ /* Directory separator is \ when cross-compiling for MS Windows systems */ #if defined(__MINGW32__) -#define DIRSEP '\\' +#define DIRSEP ('\\') #else #define DIRSEP '/' #endif @@ -118,3 +118,74 @@ void mkdirs(const char *dirs, mode_t mode) free(dir); } + +static int is_file(const char *path) +{ + struct stat st; + + int ret = lstat(path, &st); + + if (ret == 0 && S_ISREG(st.st_mode)) + return 1; + + return 0; +} + +static long file_get_size(const char *path) +{ + FILE *fp; + + if (!is_file(path)) + return -1; + + fp = fopen(path, "rb"); + if (fp) { + long size; + + if (fseek(fp, 0, SEEK_END) == -1) + return -1; + + size = ftell(fp); + + fclose(fp); + + return size; + } + + return -1; +} + +char *file_get_content(const char *fpath) +{ + long size; + + char *page; + + size = file_get_size(fpath); + if (size == -1) { + page = NULL; + + } else if (size == 0) { + page = malloc(1); + *page = '\0'; + + } else { + FILE *fp = fopen(fpath, "rb"); + if (fp) { + page = malloc(size + 1); + if (!page || size != fread(page, 1, size, fp)) { + free(page); + return NULL; + } + + *(page + size) = '\0'; + + fclose(fp); + } else { + page = NULL; + } + } + + return page; +} +