diff --git a/ase/awk/Awk.cpp b/ase/awk/Awk.cpp index 76d952e1..6df16c10 100644 --- a/ase/awk/Awk.cpp +++ b/ase/awk/Awk.cpp @@ -1,5 +1,5 @@ /* - * $Id: Awk.cpp,v 1.22 2007/05/12 03:53:32 bacon Exp $ + * $Id: Awk.cpp,v 1.23 2007/05/12 17:05:07 bacon Exp $ */ #include @@ -550,22 +550,31 @@ namespace ASE ASE_ASSERT ((epa->type & 0xFF) == ASE_AWK_EXTIO_PIPE); Pipe pipe (epa->name, (Pipe::Mode)epa->mode); + ssize_t n; switch (cmd) { case ASE_AWK_IO_OPEN: - return awk->openPipe (pipe); + n = awk->openPipe (pipe); + if (n >= 0) epa->handle = (void*)pipe.getHandle(); + return n; + case ASE_AWK_IO_CLOSE: + pipe.setHandle (epa->handle); return awk->closePipe (pipe); case ASE_AWK_IO_READ: + pipe.setHandle (epa->handle); return awk->readPipe (pipe, data, count); case ASE_AWK_IO_WRITE: + pipe.setHandle (epa->handle); return awk->writePipe (pipe, data, count); case ASE_AWK_IO_FLUSH: + pipe.setHandle (epa->handle); return awk->flushPipe (pipe); case ASE_AWK_IO_NEXT: + pipe.setHandle (epa->handle); return awk->nextPipe (pipe); } @@ -581,22 +590,31 @@ namespace ASE ASE_ASSERT ((epa->type & 0xFF) == ASE_AWK_EXTIO_FILE); File file (epa->name, (File::Mode)epa->mode); + ssize_t n; switch (cmd) { case ASE_AWK_IO_OPEN: - return awk->openFile (file); + n = awk->openFile (file); + if (n >= 0) epa->handle = (void*)file.getHandle(); + return n; + case ASE_AWK_IO_CLOSE: + file.setHandle (epa->handle); return awk->closeFile (file); case ASE_AWK_IO_READ: + file.setHandle (epa->handle); return awk->readFile (file, data, count); case ASE_AWK_IO_WRITE: + file.setHandle (epa->handle); return awk->writeFile (file, data, count); case ASE_AWK_IO_FLUSH: + file.setHandle (epa->handle); return awk->flushFile (file); case ASE_AWK_IO_NEXT: + file.setHandle (epa->handle); return awk->nextFile (file); } @@ -612,22 +630,31 @@ namespace ASE ASE_ASSERT ((epa->type & 0xFF) == ASE_AWK_EXTIO_CONSOLE); Console console (epa->name, (Console::Mode)epa->mode); + ssize_t n; switch (cmd) { case ASE_AWK_IO_OPEN: - return awk->openConsole (console); + n = awk->openConsole (console); + if (n >= 0) epa->handle = (void*)console.getHandle(); + return n; + case ASE_AWK_IO_CLOSE: + console.setHandle (epa->handle); return awk->closeConsole (console); case ASE_AWK_IO_READ: + console.setHandle (epa->handle); return awk->readConsole (console, data, count); case ASE_AWK_IO_WRITE: + console.setHandle (epa->handle); return awk->writeConsole (console, data, count); case ASE_AWK_IO_FLUSH: + console.setHandle (epa->handle); return awk->flushConsole (console); case ASE_AWK_IO_NEXT: + console.setHandle (epa->handle); return awk->nextConsole (console); } diff --git a/ase/test/awk/Awk.cpp b/ase/test/awk/Awk.cpp index e1939b66..b836b625 100644 --- a/ase/test/awk/Awk.cpp +++ b/ase/test/awk/Awk.cpp @@ -1,5 +1,5 @@ /* - * $Id: Awk.cpp,v 1.6 2007/05/07 09:30:28 bacon Exp $ + * $Id: Awk.cpp,v 1.8 2007/05/12 17:05:07 bacon Exp $ */ #include @@ -94,26 +94,122 @@ protected: int nextPipe (Pipe& io) { return 0; } // file io handlers - int openFile (File& io) { return -1; } - int closeFile (File& io) { return 0; } - ssize_t readFile (File& io, char_t* buf, size_t len) { return 0; } - ssize_t writeFile (File& io, char_t* buf, size_t len) { return 0; } - int flushFile (File& io) { return 0; } - int nextFile (File& io) { return 0; } + int openFile (File& io) + { + Awk::File::Mode mode = io.getMode(); + FILE* fp = NULL; + + switch (mode) + { + case Awk::File::READ: + fp = ase_fopen (io.getName(), ASE_T("r")); + break; + case Awk::File::WRITE: + fp = ase_fopen (io.getName(), ASE_T("w")); + break; + case Awk::File::APPEND: + fp = ase_fopen (io.getName(), ASE_T("a")); + break; + } + + if (fp == NULL) return -1; + + io.setHandle (fp); + return 1; + } + + int closeFile (File& io) + { + fclose ((FILE*)io.getHandle()); + return 0; + } + + ssize_t readFile (File& io, char_t* buf, size_t len) + { + FILE* fp = (FILE*)io.getHandle(); + if (ase_fgets (buf, len, fp) == ASE_NULL) + { + if (ferror(fp)) return -1; + return 0; + } + + return ase_strlen(buf); + } + + ssize_t writeFile (File& io, char_t* buf, size_t len) + { + FILE* fp = (FILE*)io.getHandle(); + size_t left = len; + + while (left > 0) + { + if (*buf == ASE_T('\0')) + { + if (ase_fputc (*buf, fp) == ASE_CHAR_EOF) return -1; + left -= 1; buf += 1; + } + else + { + int n = ase_fprintf (fp, ASE_T("%.*s"), left, buf); + if (n < 0) return -1; + left -= n; buf += n; + } + } + + return len; + } + + int flushFile (File& io) + { + return ::fflush ((FILE*)io.getHandle()); + } + + int nextFile (File& io) + { + return -1; + } // console io handlers int openConsole (Console& io) { return 1; } int closeConsole (Console& io) { return 0; } + ssize_t readConsole (Console& io, char_t* buf, size_t len) { - return 0; + FILE* fp = stdin; + if (ase_fgets (buf, len, fp) == ASE_NULL) + { + if (ferror(fp)) return -1; + return 0; + } + + return ase_strlen(buf); } + ssize_t writeConsole (Console& io, char_t* buf, size_t len) { - return ase_printf (ASE_T("%.*s"), len, buf); + FILE* fp = stdout; + size_t left = len; + + while (left > 0) + { + if (*buf == ASE_T('\0')) + { + if (ase_fputc (*buf, fp) == ASE_CHAR_EOF) return -1; + left -= 1; buf += 1; + } + else + { + int n = ase_fprintf (fp, ASE_T("%.*s"), left, buf); + if (n < 0) return -1; + left -= n; buf += n; + } + } + + return len; } - int flushConsole (Console& io) { return 0; } - int nextConsole (Console& io) { return 0; } + + int flushConsole (Console& io) { return ::fflush (stdout); } + int nextConsole (Console& io) { return 0; } // primitive operations void* allocMem (size_t n) { return ::malloc (n); } @@ -193,25 +289,21 @@ int awk_main (int argc, ase_char_t* argv[]) if (awk.open() == -1) { ase_fprintf (stderr, ASE_T("cannot open awk\n")); - //awk.close (); return -1; } if (awk.parse(ASE_T("t.awk")) == -1) { ase_fprintf (stderr, ASE_T("cannot parse\n")); - //awk.close (); return -1; } if (awk.run () == -1) { ase_fprintf (stderr, ASE_T("cannot run\n")); - //awk.close (); return -1; } -// awk.close (); return 0; } diff --git a/ase/test/awk/awk.c b/ase/test/awk/awk.c index a3a16675..91ea070b 100644 --- a/ase/test/awk/awk.c +++ b/ase/test/awk/awk.c @@ -1,5 +1,5 @@ /* - * $Id: awk.c,v 1.3 2007/04/30 08:32:41 bacon Exp $ + * $Id: awk.c,v 1.4 2007/05/12 17:05:07 bacon Exp $ */ #include @@ -412,9 +412,23 @@ static ase_ssize_t awk_extio_file ( case ASE_AWK_IO_WRITE: { - int n = ase_fprintf ( - (FILE*)epa->handle, ASE_T("%.*s"), size, data); - if (n < 0) return -1; + FILE* fp = (FILE*)epa->handle; + ssize_t left = size; + + while (left > 0) + { + if (*data == ASE_T('\0')) + { + if (ase_fputc (*data, fp) == ASE_CHAR_EOF) return -1; + left -= 1; data += 1; + } + else + { + int n = ase_fprintf (fp, ASE_T("%.*s"), left, data); + if (n < 0) return -1; + left -= n; data += n; + } + } return size; } diff --git a/ase/test/awk/regress.sh b/ase/test/awk/regress.sh index c16b3183..589a4cfa 100755 --- a/ase/test/awk/regress.sh +++ b/ase/test/awk/regress.sh @@ -6,7 +6,7 @@ run_script_for_init() data="$2" output=`echo $script | sed 's/\.awk$/.out/g'` - ./aseawk -d -f "$script" "$data" > "$output" + "$ASEAWK" -d -f "$script" "$data" > "$output" } run_init() @@ -34,7 +34,7 @@ run_script_for_test() output=`echo $script | sed 's/\.awk$/.out/g'` echo ">> RUNNING $script" - ./aseawk -d -f "$script" "$data" > "$output.$pid" + "$ASEAWK" -d -f "$script" "$data" > "$output.$pid" #diff -y "$output" "$output.$pid" diff "$output" "$output.$pid" @@ -113,8 +113,16 @@ run_test() # main # #--------# -if [ ! -x ./aseawk ] +if [ -x ./aseawk ] then + ASEAWK="./aseawk" +elif [ -x ../../release/bin/aseawk ] +then + ASEAWK="../../release/bin/aseawk" +elif [ -x ../../debug/bin/aseawk ] +then + ASEAWK="../../debug/bin/aseawk" +else echo "Error: cannot locate a relevant awk interpreter" exit 1; fi diff --git a/ase/utl/stdio.h b/ase/utl/stdio.h index 318274ed..6f6150a4 100644 --- a/ase/utl/stdio.h +++ b/ase/utl/stdio.h @@ -1,5 +1,5 @@ /* - * $Id: stdio.h,v 1.3 2007/04/30 08:32:51 bacon Exp $ + * $Id: stdio.h,v 1.4 2007/05/12 17:05:07 bacon Exp $ */ #ifndef _ASE_UTL_STDIO_H_ @@ -22,12 +22,18 @@ #define ase_fgets _fgetts #define ase_fgetc _fgettc + #define ase_fputs _fputts + #define ase_fputc _fputtc #elif defined(ASE_CHAR_IS_MCHAR) #define ase_fgets fgets #define ase_fgetc fgetc + #define ase_fputs fputs + #define ase_fputc fputc #else #define ase_fgets fgetws #define ase_fgetc fgetwc + #define ase_fputs fputws + #define ase_fputc fputwc #endif #ifdef __cplusplus