This commit is contained in:
hyung-hwan 2008-01-16 00:36:07 +00:00
parent 90140d3c70
commit 4ae1cec546
4 changed files with 99 additions and 23 deletions

View File

@ -266,7 +266,11 @@ StdAwk::ssize_t StdAwk::readPipe (Pipe& io, char_t* buf, size_t len)
while (n < (ssize_t)len) while (n < (ssize_t)len)
{ {
ase_cint_t c = ase_fgetc (fp); ase_cint_t c = ase_fgetc (fp);
if (c == ASE_CHAR_EOF) break; if (c == ASE_CHAR_EOF)
{
if (ase_ferror(fp)) n = -1;
break;
}
buf[n++] = c; buf[n++] = c;
if (c == ASE_T('\n')) break; if (c == ASE_T('\n')) break;
@ -369,7 +373,11 @@ StdAwk::ssize_t StdAwk::readFile (File& io, char_t* buf, size_t len)
while (n < (ssize_t)len) while (n < (ssize_t)len)
{ {
ase_cint_t c = ase_fgetc (fp); ase_cint_t c = ase_fgetc (fp);
if (c == ASE_CHAR_EOF) break; if (c == ASE_CHAR_EOF)
{
if (ase_ferror(fp)) n = -1;
break;
}
buf[n++] = c; buf[n++] = c;
if (c == ASE_T('\n')) break; if (c == ASE_T('\n')) break;

View File

@ -301,7 +301,11 @@ protected:
while (n < (ssize_t)len) while (n < (ssize_t)len)
{ {
ase_cint_t c = ase_fgetc (fp); ase_cint_t c = ase_fgetc (fp);
if (c == ASE_CHAR_EOF) break; if (c == ASE_CHAR_EOF)
{
if (ase_ferror(fp)) n = -1;
break;
}
buf[n++] = c; buf[n++] = c;
if (c == ASE_T('\n')) break; if (c == ASE_T('\n')) break;
@ -424,6 +428,7 @@ protected:
ase_cint_t c = ase_fgetc (fp); ase_cint_t c = ase_fgetc (fp);
if (c == ASE_CHAR_EOF) if (c == ASE_CHAR_EOF)
{ {
if (ase_ferror(fp)) return -1;
if (t->nextConIdx >= numConInFiles) break; if (t->nextConIdx >= numConInFiles) break;
const char_t* fn = conInFile[t->nextConIdx]; const char_t* fn = conInFile[t->nextConIdx];

View File

@ -239,11 +239,19 @@ static ase_ssize_t awk_srcio_in (
} }
else if (cmd == ASE_AWK_IO_READ) else if (cmd == ASE_AWK_IO_READ)
{ {
if (size <= 0) return -1; ase_ssize_t n = 0;
c = ase_fgetc ((FILE*)src_io->input_handle); FILE* fp = (FILE*)src_io->input_handle;
if (c == ASE_CHAR_EOF) return 0; while (!ase_feof(fp) && n < size)
*data = (ase_char_t)c; {
return 1; ase_cint_t c = ase_fgetc (fp);
if (c == ASE_CHAR_EOF)
{
if (ase_ferror(fp)) n = -1;
break;
}
data[n++] = c;
}
return n;
} }
return -1; return -1;
@ -321,6 +329,7 @@ static ase_ssize_t awk_extio_pipe (
case ASE_AWK_IO_READ: case ASE_AWK_IO_READ:
{ {
/*
int chunk = (size > ASE_TYPE_MAX(int))? ASE_TYPE_MAX(int): (int)size; int chunk = (size > ASE_TYPE_MAX(int))? ASE_TYPE_MAX(int): (int)size;
if (ase_fgets (data, chunk, (FILE*)epa->handle) == ASE_NULL) if (ase_fgets (data, chunk, (FILE*)epa->handle) == ASE_NULL)
{ {
@ -328,6 +337,20 @@ static ase_ssize_t awk_extio_pipe (
return 0; return 0;
} }
return ase_strlen(data); return ase_strlen(data);
*/
ase_ssize_t n = 0;
FILE* fp = (FILE*)epa->handle;
while (!ase_feof(fp) && n < size)
{
ase_cint_t c = ase_fgetc (fp);
if (c == ASE_CHAR_EOF)
{
if (ase_ferror(fp)) n = -1;
break;
}
data[n++] = c;
}
return n;
} }
case ASE_AWK_IO_WRITE: case ASE_AWK_IO_WRITE:
@ -443,6 +466,7 @@ static ase_ssize_t awk_extio_file (
case ASE_AWK_IO_READ: case ASE_AWK_IO_READ:
{ {
/*
int chunk = (size > ASE_TYPE_MAX(int))? ASE_TYPE_MAX(int): (int)size; int chunk = (size > ASE_TYPE_MAX(int))? ASE_TYPE_MAX(int): (int)size;
if (ase_fgets (data, chunk, (FILE*)epa->handle) == ASE_NULL) if (ase_fgets (data, chunk, (FILE*)epa->handle) == ASE_NULL)
{ {
@ -450,6 +474,20 @@ static ase_ssize_t awk_extio_file (
return 0; return 0;
} }
return ase_strlen(data); return ase_strlen(data);
*/
ase_ssize_t n = 0;
FILE* fp = (FILE*)epa->handle;
while (!ase_feof(fp) && n < size)
{
ase_cint_t c = ase_fgetc (fp);
if (c == ASE_CHAR_EOF)
{
if (ase_ferror(fp)) n = -1;
break;
}
data[n++] = c;
}
return n;
} }
case ASE_AWK_IO_WRITE: case ASE_AWK_IO_WRITE:
@ -503,6 +541,23 @@ static const ase_char_t* infiles[1000] =
ASE_NULL ASE_NULL
}; };
static ase_ssize_t getdata (ase_char_t* data, ase_size_t size, FILE* fp)
{
ase_ssize_t n = 0;
while (!ase_feof(fp) && n < size)
{
ase_cint_t c = ase_fgetc (fp);
if (c == ASE_CHAR_EOF)
{
if (ase_ferror(fp)) n = -1;
break;
}
data[n++] = c;
if (c == ASE_T('\n')) break;
}
return n;
}
static ase_ssize_t awk_extio_console ( static ase_ssize_t awk_extio_console (
int cmd, void* arg, ase_char_t* data, ase_size_t size) int cmd, void* arg, ase_char_t* data, ase_size_t size)
{ {
@ -518,12 +573,15 @@ static ase_ssize_t awk_extio_console (
} }
else if (cmd == ASE_AWK_IO_READ) else if (cmd == ASE_AWK_IO_READ)
{ {
int chunk = (size > ASE_TYPE_MAX(int))? ASE_TYPE_MAX(int): (int)size; ase_ssize_t n;
/*int chunk = (size > ASE_TYPE_MAX(int))? ASE_TYPE_MAX(int): (int)size;
while (ase_fgets (data, chunk, (FILE*)epa->handle) == ASE_NULL) while (ase_fgets (data, chunk, (FILE*)epa->handle) == ASE_NULL)
{ {
if (ferror((FILE*)epa->handle)) return -1; if (ferror((FILE*)epa->handle)) return -1;*/
while ((n = getdata(data,size,(FILE*)epa->handle)) == 0)
{
/* it has reached the end of the current file. /* it has reached the end of the current file.
* open the next file if available */ * open the next file if available */
if (infiles[infile_no] == ASE_NULL) if (infiles[infile_no] == ASE_NULL)
@ -611,7 +669,8 @@ static ase_ssize_t awk_extio_console (
infile_no++; infile_no++;
} }
return ase_strlen(data); /*return ase_strlen(data);*/
return n;
} }
else if (cmd == ASE_AWK_IO_WRITE) else if (cmd == ASE_AWK_IO_WRITE)
{ {

View File

@ -20,22 +20,26 @@
#define ase_fprintf _ftprintf #define ase_fprintf _ftprintf
#define ase_vfprintf _vftprintf #define ase_vfprintf _vftprintf
#define ase_fgets _fgetts #define ase_fgets(x,y,s) _fgetts(x,y,s)
#define ase_fgetc _fgettc #define ase_fgetc(x) _fgettc(x)
#define ase_fputs _fputts #define ase_fputs(x,s) _fputts(x,s)
#define ase_fputc _fputtc #define ase_fputc(x,s) _fputtc(x,s)
#elif defined(ASE_CHAR_IS_MCHAR) #elif defined(ASE_CHAR_IS_MCHAR)
#define ase_fgets fgets #define ase_fgets(x,y,s) fgets(x,y,s)
#define ase_fgetc fgetc #define ase_fgetc(x) fgetc(x)
#define ase_fputs fputs #define ase_fputs(x,s) fputs(x,s)
#define ase_fputc fputc #define ase_fputc(x,s) fputc(x,s)
#else #else
#define ase_fgets fgetws #define ase_fgets(x,y,s) fgetws(x,y,s)
#define ase_fgetc fgetwc #define ase_fgetc(x) fgetwc(x)
#define ase_fputs fputws #define ase_fputs(x,s) fputws(x,s)
#define ase_fputc fputwc #define ase_fputc(x,s) fputwc(x,s)
#endif #endif
#define ase_feof(s) feof(s)
#define ase_ferror(s) ferror(s)
#define ase_clearerr(s) clearerr(s)
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif