/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * COPYING NOTES * * iofile.c -- Advanced I/O file managing functions * * Copyright (C) 2000 Roberto A. Foglietta <robang@libero.it> * Copyright (C) 2002 GEA-Automotive <fogliettar@gea-automotive.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. * * 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * REVISION NOTES: * * released 16-10-2002 by Roberto A. Foglietta * */ #include <stdlib.h> #include <unistd.h> #include <memory.h> #include "iofile.h" #ifdef DEBUG_OUT # undef DEBUG_OUT #endif #define DEBUG_OUT 0 #define PRINTF if(DEBUG_OUT) printf /*********************************************************************** FUNZIONI DI SUPPORTO ***********************************************************************/ FILE * check_n_openfile (const char *name, const char *mode) { int flag, i, len; flag = R_OK | F_OK; len = strlen (mode); for (i = 0; i < len; i++) { if (mode[i] == 'w' || mode[i] == 'a' || mode[i] == '+') { flag |= W_OK; break; } } if (access (name, flag)) return NULL; else return fopen (name, mode); } unsigned long get_file_lenght (FILE * fp) { long lun; fflush (fp); fseek (fp, 0, SEEK_END); fflush (fp); lun = ftell (fp); rewind (fp); fflush (fp); return lun; } unsigned char * read_file_to_buffer (const char *name, const char *mode, long *lun) { FILE *fp; unsigned long len; unsigned char *buf; fp = check_n_openfile (name, mode); if (fp == NULL) return NULL; else PRINTF ("Aperto il file\n"); len = get_file_lenght (fp); if (len <= 0) return NULL; else PRINTF ("lunghezza %ld\n", len); buf = (unsigned char *) malloc (len); if (buf == NULL) return NULL; else PRINTF ("Allocata la memoria\n"); len = (long) read (fileno (fp), buf, (size_t) len); PRINTF ("letti %ld bytes\n", len); fclose (fp); if (len <= 0) { free (buf); buf = NULL; } else { PRINTF ("Lettura file OK: 0x%lx\n", (unsigned long) buf); *lun = len; } return buf; }