forked from KolibriOS/kolibrios
-fixed memory leak in fopen/fclose
-added support relative path in fopen -make up of build.bat git-svn-id: svn://kolibrios.org@245 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
6ec45316ae
commit
c4329e6227
@ -1,4 +1,8 @@
|
|||||||
@echo off
|
@echo off
|
||||||
|
echo ####################################################
|
||||||
|
echo # Melibc builder #
|
||||||
|
echo # usage: build [clean] #
|
||||||
|
echo ####################################################
|
||||||
rem #### CONFIG SECTION ####
|
rem #### CONFIG SECTION ####
|
||||||
set LIBNAME=melibc.a
|
set LIBNAME=melibc.a
|
||||||
set INCLUDE=include
|
set INCLUDE=include
|
||||||
@ -56,7 +60,9 @@ pause
|
|||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
:Exit_OK
|
:Exit_OK
|
||||||
echo all operations has been done...
|
echo ####################################################
|
||||||
echo for cleaning run this script with param " clean"
|
echo # All operations has been done... #
|
||||||
|
echo # For cleaning run this script with param " clean" #
|
||||||
|
echo ####################################################
|
||||||
pause
|
pause
|
||||||
exit 0
|
exit 0
|
@ -5,6 +5,7 @@ int fclose(FILE* file)
|
|||||||
int res;
|
int res;
|
||||||
res=_msys_write_file(file->filename, 0, file->filesize, file->buffer);
|
res=_msys_write_file(file->filename, 0, file->filesize, file->buffer);
|
||||||
free(file->buffer);
|
free(file->buffer);
|
||||||
|
free(file->filename);
|
||||||
free(file);
|
free(file);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
@ -1,5 +1,56 @@
|
|||||||
#include "stdio.h"
|
#include <stdio.h>
|
||||||
#include "string.h"
|
#include <string.h>
|
||||||
|
|
||||||
|
|
||||||
|
extern struct{int argc; char** argv;} __ARGS;
|
||||||
|
|
||||||
|
char* getfullpath(const char* relpath){
|
||||||
|
byte prev_is_slash=0;
|
||||||
|
int len=0, depth=0, i;
|
||||||
|
char* buff;
|
||||||
|
buff = malloc(strlen(__ARGS.argv[0]) + strlen(relpath));
|
||||||
|
if(*relpath == '/') buff[0] = '\0';
|
||||||
|
else {
|
||||||
|
len = strrchr(__ARGS.argv[0], '/') - __ARGS.argv[0] + 1;
|
||||||
|
strncpy(buff, __ARGS.argv[0], len);
|
||||||
|
prev_is_slash = 1;
|
||||||
|
buff[len] = 0;
|
||||||
|
for(i=0; buff[i]; i++)
|
||||||
|
if(buff[i] == '/' && i < len-1) depth++;
|
||||||
|
}
|
||||||
|
for (; *relpath; relpath++){
|
||||||
|
switch (*relpath){
|
||||||
|
case '/':
|
||||||
|
prev_is_slash = 1;
|
||||||
|
buff[len++] = '/';
|
||||||
|
break;
|
||||||
|
case '.':
|
||||||
|
if(*(relpath+1) == '.' && *(relpath+2) == '/' && prev_is_slash){
|
||||||
|
if(!depth) return 0;
|
||||||
|
buff[len-1] = 0;
|
||||||
|
len = strrchr(buff, '/') + 1 - buff;
|
||||||
|
buff[len] = 0;
|
||||||
|
depth--;
|
||||||
|
relpath += 2;
|
||||||
|
} else {
|
||||||
|
depth++;
|
||||||
|
buff[len++] = '.';
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if(prev_is_slash){
|
||||||
|
depth++;
|
||||||
|
prev_is_slash = 0;
|
||||||
|
}
|
||||||
|
buff[len++] = *relpath;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buff[len]= '\0';
|
||||||
|
return buff;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
FILE* fopen(const char* filename, const char *mode)
|
FILE* fopen(const char* filename, const char *mode)
|
||||||
{
|
{
|
||||||
FILE* res;
|
FILE* res;
|
||||||
@ -37,20 +88,22 @@ FILE* fopen(const char* filename, const char *mode)
|
|||||||
res->buffersize=0;
|
res->buffersize=0;
|
||||||
res->filesize=0;
|
res->filesize=0;
|
||||||
res->filepos=0;
|
res->filepos=0;
|
||||||
res->filename=0;
|
|
||||||
res->mode=imode;
|
res->mode=imode;
|
||||||
|
res->filename=getfullpath(filename);
|
||||||
//check if file exists
|
//check if file exists
|
||||||
res=_msys_read_file(filename, 0, 0, 0, &res->filesize);
|
res=_msys_read_file(res->filename, 0, 0, 0, &res->filesize);
|
||||||
if (res==5)
|
if (res==5)
|
||||||
{
|
{
|
||||||
if ((imode & 3) == FILE_OPEN_READ)
|
if ((imode & 3) == FILE_OPEN_READ)
|
||||||
{
|
{
|
||||||
|
free(res->filename);
|
||||||
free(res);
|
free(res);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
res=_msys_create_file(filename);
|
res=_msys_create_file(res->filename);
|
||||||
if (res!=0)
|
if (res!=0)
|
||||||
{
|
{
|
||||||
|
free(res->filename);
|
||||||
free(res);
|
free(res);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -62,6 +115,7 @@ FILE* fopen(const char* filename, const char *mode)
|
|||||||
res->buffer=malloc(res->buffersize);
|
res->buffer=malloc(res->buffersize);
|
||||||
if (res->buffer=0)
|
if (res->buffer=0)
|
||||||
{
|
{
|
||||||
|
free(res->filename);
|
||||||
free(res);
|
free(res);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -75,7 +129,7 @@ FILE* fopen(const char* filename, const char *mode)
|
|||||||
free(res);
|
free(res);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
res=_msys_read_file(filename,0,res->filesize,res->buffer,0);
|
res=_msys_read_file(res->filename,0,res->filesize,res->buffer,0);
|
||||||
if (res!=0)
|
if (res!=0)
|
||||||
{
|
{
|
||||||
free(res->buffer);
|
free(res->buffer);
|
||||||
@ -84,6 +138,5 @@ FILE* fopen(const char* filename, const char *mode)
|
|||||||
if (imode & 3==FILE_OPEN_APPEND)
|
if (imode & 3==FILE_OPEN_APPEND)
|
||||||
res->filepos=res->filesize;
|
res->filepos=res->filesize;
|
||||||
}
|
}
|
||||||
res->filename=strdup(filename);
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ section '.text' executable
|
|||||||
public start
|
public start
|
||||||
extrn mf_init
|
extrn mf_init
|
||||||
extrn main
|
extrn main
|
||||||
|
public argc as '__ARGS'
|
||||||
|
|
||||||
__DEBUG__ equ 1
|
__DEBUG__ equ 1
|
||||||
__DEBUG_LEVEL__ equ 1
|
__DEBUG_LEVEL__ equ 1
|
||||||
|
Loading…
Reference in New Issue
Block a user