summaryrefslogtreecommitdiff
path: root/readline.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'readline.cpp')
-rw-r--r--readline.cpp36
1 files changed, 19 insertions, 17 deletions
diff --git a/readline.cpp b/readline.cpp
index f13852e..50d2b2b 100644
--- a/readline.cpp
+++ b/readline.cpp
@@ -10,6 +10,8 @@
#include <stdio.h>
#include "readline.h"
+extern char *strcatrealloc(char *dest, const char *src);
+
// --- cReadLineInfosatepg ---------------------------------------------------
cReadLineInfosatepg::cReadLineInfosatepg(void)
@@ -19,52 +21,52 @@ cReadLineInfosatepg::cReadLineInfosatepg(void)
cReadLineInfosatepg::~cReadLineInfosatepg()
{
- free(buffer);
+ if (buffer) free(buffer);
}
char *cReadLineInfosatepg::Read(FILE *f,size_t *size)
{
- free(buffer); buffer=NULL;
+ if (buffer) free(buffer);
+ buffer=NULL;
if ((!size) || (!f)) return NULL;
bool ext=false;
*size=0;
+ char *tempbuffer=NULL;
+ size_t tempsize=0;
do
{
- char *tempbuffer=NULL;
- size_t tempsize=0;
-
ext=false;
int n = getline(&tempbuffer, &tempsize, f);
if (n > 0)
{
if (tempbuffer[n-1] == '\n')
{
- n--;
- tempbuffer[n] = 0;
+ tempbuffer[--n] = 0;
if (n > 0)
{
if (tempbuffer[n-1] == '\r')
- n--;
- tempbuffer[n] = 0;
+ tempbuffer[--n] = 0;
}
}
if (n>0)
{
if (tempbuffer[n-1] == '\\')
{
- n--;
- tempbuffer[n]=0;
+ tempbuffer[--n]=0;
ext=true;
}
}
-
- buffer=(char*) realloc(buffer,*size+(n+1));
- snprintf(&buffer[*size],n+1,tempbuffer);
- free(tempbuffer);
- *size+=n;
+ if (n>0) {
+ buffer=strcatrealloc(buffer,tempbuffer);
+ //tempbuffer[0]=0;
+ *size+=n;
+ } else {
+ //tempbuffer[0]=0;
+ ext=true;
+ }
}
}
while (ext==true);
-
+ if (tempbuffer) free(tempbuffer);
return buffer;
}