V
Das ist ja mal richtig schwer zu lesen und tz warten.
Nee, nee.
RGEE schrieb:
#define NOT_ENOUGH_SIGNS -1
#define CHECK_ERRNO(message, text) {\
if(errno != 0) {\
/*
RÃCKGABEWERT von fopen
Bei erfolgreichem Abschluss geben fopen(), fdopen() und freopen() einen
FILE-Zeiger zurück. Anderenfalls wird NULL zurückgegeben und errno
dem Fehler entsprechend gesetzt.
*/
//Nur gegen errno zu testen ist doch falsch.
fprintf(stderr, "A problem has occurred in %s! %s\n", message, \
strerror(errno));\
CLEAN_TEXT(text);\
return errno;\
}\
}\
#define CLEAN_TEXT(text) {\//Weit weg von der Funktion.
if(kernelPointer != NULL) {\
free(text);\
text = NULL;\
}\
}\
int readFileToChar(char **text, char *path) {
FILE *fileHandle = NULL;//Initialisierung mit seltsamen Werten
size_t numberOfSigns = 0;
size_t readSigns = 0;
*text = NULL;
fileHandle = fopen(path, "r");
REA_CHECK_ERRNO("fopen", *text);
fseek(fileHandle, 0, SEEK_END);//fseek willste nicht testen?
numberOfSigns = ftell(fileHandle);
rewind(fileHandle);
CHECK_ERRNO("ftell", *text);
*text = malloc(numberOfSigns + 1);
CHECK_ERRNO("malloc", *text);
readSigns = fread(*text, sizeof(char), numberOfSigns, fileHandle);
REA_CHECK_ERRNO("fread", *text);
if(readSigns != numberOfSigns) {
fprintf(stderr, "A problem has occurred in fread! Read not enough signs.\n");
CLEAN_TEXT(text)
return NOT_ENOUGH_SIGNS;
}
(*text)[numberOfSigns] = '\0';//würde ich gar nicht machen, für fehler reicht
//der return-wert.
fclose(fileHandle);
CHECK_ERRNO("fclose", *text);
return 0;
}
Ich versuche das mal umzusetzen mit dem goto-Trick (und Makros, aber weiß nicht, ob das gut ist):
//Makros nicht nur für diese eine Funktion
#define CHECK_ERRNO(condition,fName,jump)\
if(!(condition)){\
fprintf(stderr,"A problem has occurred in %s! %s\n",fname,strerror(errno));\
retCode=errno;\
goto jump;\
}
#define CHECK(condition,fName,jump,retCode)\
if(!(condition)){\
fprintf(stderr,"A problem has occurred in %s! %s\n",fname,strerror(errno));\
retCode=retCode;\
goto jump;\
}
int readFileToChar(char **text, char *path) {
FILE *fileHandle;
size_t numberOfSigns;
size_t readSigns;
int returnCode;
CHECK_ERRNO(
(fileHandle=fopen(path, "r"))!=NULL,
"fopen",cleanup_fopen);
CHECK_ERRNO(
fseek(fileHandle, 0, SEEK_END)!=-1,
"fseek",cleanup_fopen);
CHECK_ERRNO(
(numberOfSigns = ftell(fileHandle))!=-1,
"ftell",cleanup_fopen);
rewind(fileHandle);
CHECK((*text = malloc(numberOfSigns + 1))!=0,
"A Problem has occured in malloc",cleanup_fopen,-1);
CHECK((readSigns = fread(*text, sizeof(char), numberOfSigns, fileHandle)!=numberOfSigns),
"A problem has occurred in fread! Read not enough signs.",cleanup_malloc,NOT_ENOUGH_SIGNS);
(*text)[numberOfSigns] = '\0';
returnCode=numberOfSigns;
cleanup_fopen:
fclose(fileHandle);
cleanup_malloc:
free(*text);
return returnCode;
}