Blob Blame History Raw
diff -Nuarp -x Makefile -x 'gmon*' -x 'profile*' -x 'lv-*' lv451/src/command.c lv451.gotom/src/command.c
--- lv451/src/command.c	2004-01-05 16:42:31.000000000 +0900
+++ lv451.gotom/src/command.c	2005-05-06 21:27:02.000000000 +0900
@@ -497,7 +497,7 @@ private void CommandReload( unsigned int
   byte defaultCodingSystem;
   stream_t st;
 
-  if( NULL != f->sp ){
+  if( NULL != f->sp.iop ){
     label = "cannot reload non-regular files";
     return;
   }
@@ -506,9 +506,9 @@ private void CommandReload( unsigned int
     label = "cannot reload current file";
     return;
   } else {
-    fclose( f->fp );
+    fclose( f->fp.iop );
     st.fp = fp;
-    st.sp = f->sp;
+    st.sp = f->sp.iop;
     st.pid = f->pid;
   }
 
@@ -618,7 +618,7 @@ private void CommandEdit( unsigned int a
   byte *fileName;
   int lineNumber;
 
-  if( NULL != f->sp ){
+  if( NULL != f->sp.iop ){
     label = "cannot edit non-regular files";
     return;
   }
@@ -698,7 +698,7 @@ private void CommandPoll( unsigned int a
 
   kb_interrupted = FALSE;
 
-  if( NULL != f->sp ){
+  if( NULL != f->sp.iop ){
     label = "cannot poll non-regular files";
     return;
   }
@@ -718,8 +718,8 @@ private void CommandPoll( unsigned int a
     ConsoleSetAttribute( 0 );
     ConsoleFlush();
 
-    (void)fseek( f->fp, 0, SEEK_END );
-    pos = ftell( f->fp );
+    (void)IobufFseek( &f->fp, 0, SEEK_END );
+    pos = IobufFtell( &f->fp );
 
     ConsoleEnableInterrupt();
 
@@ -728,8 +728,8 @@ private void CommandPoll( unsigned int a
       if( kb_interrupted )
 	break;
 
-      (void)fseek( f->fp, 0, SEEK_END );
-      if( ftell( f->fp ) > pos ){
+      (void)IobufFseek( &f->fp, 0, SEEK_END );
+      if( IobufFtell( &f->fp ) > pos ){
 	// it grew
 	break;
       }
diff -Nuarp -x Makefile -x 'gmon*' -x 'profile*' -x 'lv-*' lv451/src/configure.in lv451.gotom/src/configure.in
--- lv451/src/configure.in	2004-01-05 15:35:44.000000000 +0900
+++ lv451.gotom/src/configure.in	2005-05-06 21:28:07.000000000 +0900
@@ -57,5 +57,16 @@ AC_DEFUN([AM_LANGINFO_CODESET],
 
 AM_LANGINFO_CODESET
 
+AC_MSG_CHECKING(whether fastio is used)
+AC_ARG_ENABLE(fastio,
+	[ --enable-fastio          tries to reduce stdio overhead],
+	[if ! test "$enableval" = no; then
+	 	AC_DEFINE(USE_INTERNAL_IOBUF, 1)
+		AC_MSG_RESULT(yes)
+	 else
+		AC_MSG_RESULT(no)
+	 fi],
+	[AC_MSG_RESULT(no)])
+
 dnl AC_OUTPUT(Makefile src/Makefile)
 AC_OUTPUT(Makefile)
diff -Nuarp -x Makefile -x 'gmon*' -x 'profile*' -x 'lv-*' lv451/src/fetch.c lv451.gotom/src/fetch.c
--- lv451/src/fetch.c	2004-01-05 16:30:15.000000000 +0900
+++ lv451.gotom/src/fetch.c	2005-05-06 20:03:44.000000000 +0900
@@ -151,7 +151,7 @@ private void PageLoad( file_t *f, int bl
 {
   int i;
 
-  if( fseek( f->fp, ptr, SEEK_SET ) )
+  if( IobufFseek( &f->fp, ptr, SEEK_SET ) )
     perror( "PageLoad()" ), exit( -1 );
 
   f->eof = FALSE;
diff -Nuarp -x Makefile -x 'gmon*' -x 'profile*' -x 'lv-*' lv451/src/file.c lv451.gotom/src/file.c
--- lv451/src/file.c	2004-01-05 16:30:15.000000000 +0900
+++ lv451.gotom/src/file.c	2005-05-06 21:36:20.000000000 +0900
@@ -68,6 +68,57 @@ public void FileFreeLine( file_t *f )
   }
 }
 
+#ifdef USE_INTERNAL_IOBUF
+public inline int IobufGetc( iobuf_t *iobuf )
+{
+  if( iobuf->cur >= iobuf->last ){
+    /* no stream buffer, reset and fill now */
+    iobuf->cur = 0;
+    iobuf->last = fread( iobuf->buf, sizeof( byte ), IOBUF_DEFAULT_SIZE, iobuf->iop );
+    if( iobuf->last <= 0 ){
+      return EOF;
+    }
+  }
+  return iobuf->buf[ iobuf->cur++ ];
+}
+
+public inline int IobufUngetc( int ch, iobuf_t *iobuf )
+{
+  if( iobuf->cur == 0 ){
+    /* XXX: it should be tied to fp sanely */
+    return EOF;
+  }
+  iobuf->buf[ --iobuf->cur ] = (byte)ch;
+  return ch;
+}
+
+public long IobufFtell( iobuf_t *iobuf )
+{
+  long ptr;
+  ptr = ftell( iobuf->iop );
+  if( iobuf->cur == iobuf->last ){
+    return ptr;
+  }
+  return ptr - ( iobuf->last - iobuf->cur );
+}
+
+public int IobufFseek( iobuf_t *iobuf, long off, int mode )
+{
+  iobuf->cur = iobuf->last = 0;  /* flush all iobuf */
+  return fseek( iobuf->iop, off, mode );
+}
+
+public int IobufFeof( iobuf_t *iobuf )
+{
+  if( iobuf->cur == iobuf->last ){
+    return feof( iobuf->iop );
+  } else {
+    return 1;
+  }
+}
+#endif
+
+
 /*
  * 現在のファイルポインタから 1行を読み込んでバッファに格納する.
  * コード系の自動判別の対象となる場合, 自動判別を行なう.
@@ -93,21 +144,21 @@ public byte *FileLoadLine( file_t *f, in
   count = 0;
   idx = 0;
 
-  while( EOF != (ch = getc( f->fp )) ){
+  while( EOF != (ch = IobufGetc( &f->fp )) ){
     len++;
     load_array[ count ][ idx++ ] = (byte)ch;
     if( LF == ch ){
       /* UNIX style */
       break;
     } else if( CR == ch ){
-      if( LF == (ch = getc( f->fp )) ){
+      if( LF == (ch = IobufGetc( &f->fp )) ){
 	/* MSDOS style */
       } else if( EOF == ch ){
 	/* need to avoid EOF due to pre-load of that */
 	ch = LF;
       } else {
 	/* Mac style */
-	ungetc( ch, f->fp );
+	IobufUngetc( ch, &f->fp );
       }
       load_array[ count ][ idx - 1 ] = LF;
       break;
@@ -207,23 +258,23 @@ public boolean_t FileStretch( file_t *f,
   ptr = f->lastPtr;
   segment = f->lastSegment;
 
-  if( fseek( f->fp, ptr, SEEK_SET ) )
+  if( IobufFseek( &f->fp, ptr, SEEK_SET ) )
     perror( "FileStretch()" ), exit( -1 );
 
 #ifndef MSDOS /* IF NOT DEFINED */
-  if( NULL != f->sp ){
-    while( EOF != (ch = getc( f->sp )) ){
-      putc( ch, f->fp );
+  if( NULL != f->sp.iop ){
+    while( EOF != (ch = IobufGetc( &f->sp )) ){
+      IobufPutc( ch, &f->fp );
       count++;
       if( LF == ch || CR == ch || count == (LOAD_SIZE * LOAD_COUNT) ){
 	if( CR == ch ){
-	  if( LF != (ch = getc( f->sp )) )
-	    ungetc( ch, f->sp );
+	  if( LF != (ch = IobufGetc( &f->sp )) )
+	    IobufUngetc( ch, &f->sp );
 	  else
-	    putc( LF, f->fp );
+	    IobufPutc( LF, &f->fp );
 	}
 	count = 0;
-	if( 0 > (ptr = ftell( f->fp )) )
+	if( 0 > (ptr = IobufFtell( &f->fp )) )
 	  perror( "FileStretch()" ), exit( -1 );
 	if( ++line == LV_PAGE_SIZE ){
 	  f->totalLines += line;
@@ -249,21 +300,21 @@ public boolean_t FileStretch( file_t *f,
 	  return FALSE;
       }
     }
-    if( -1 != f->pid && feof( f->sp ) ){
+    if( -1 != f->pid && IobufFeof( &f->sp ) ){
       int status;
       wait( &status );
     }
   } else {
 #endif /* MSDOS */
-    while( EOF != (ch = getc( f->fp )) ){
+    while( EOF != (ch = IobufGetc( &f->fp )) ){
       count++;
       if( LF == ch || CR == ch || count == (LOAD_SIZE * LOAD_COUNT) ){
 	if( CR == ch ){
-	  if( LF != (ch = getc( f->fp )) )
-	    ungetc( ch, f->fp );
+	  if( LF != (ch = IobufGetc( &f->fp )) )
+	    IobufUngetc( ch, &f->fp );
 	}
 	count = 0;
-	if( 0 > (ptr = ftell( f->fp )) )
+	if( 0 > (ptr = IobufFtell( &f->fp )) )
 	  perror( "FileStretch()" ), exit( -1 );
 	if( ++line == LV_PAGE_SIZE ){
 	  f->totalLines += line;
@@ -301,7 +352,7 @@ public boolean_t FileStretch( file_t *f,
       segment++;
       f->totalLines += line;
       f->lastSegment = segment;
-      if( 0 > (f->lastPtr = ftell( f->fp )) )
+      if( 0 > (f->lastPtr = IobufFtell( &f->fp )) )
 	perror( "FileStretch()" ), exit( -1 );
     }
     f->done = TRUE;
@@ -325,7 +376,7 @@ public boolean_t FileSeek( file_t *f, un
     if( FALSE == FileStretch( f, segment ) )
       return FALSE;
 
-  if( fseek( f->fp, f->slot[ Frame( segment ) ][ Slot( segment ) ], SEEK_SET ) )
+  if( IobufFseek( &f->fp, f->slot[ Frame( segment ) ][ Slot( segment ) ], SEEK_SET ) )
     perror( "FileSeek()" ), exit( -1 );
 
   return TRUE;
@@ -392,8 +443,14 @@ public file_t *FileAttach( byte *fileNam
   f->fileNameI18N	= NULL;
   f->fileNameLength	= 0;
 
-  f->fp			= st->fp;
-  f->sp			= st->sp;
+  f->fp.iop		= st->fp;
+  f->sp.iop		= st->sp;
+#ifdef USE_INTERNAL_IOBUF
+  f->fp.cur		= 0;
+  f->fp.last		= 0;
+  f->sp.cur		= 0;
+  f->sp.last		= 0;
+#endif
   f->pid		= st->pid;
   f->lastSegment	= 0;
   f->totalLines		= 0L;
diff -Nuarp -x Makefile -x 'gmon*' -x 'profile*' -x 'lv-*' lv451/src/file.h lv451.gotom/src/file.h
--- lv451/src/file.h	2004-01-05 16:30:15.000000000 +0900
+++ lv451.gotom/src/file.h	2005-05-06 21:34:53.000000000 +0900
@@ -27,6 +27,10 @@
 #define FRAME_SIZE	4096U
 #endif /* MSDOS */
 
+#ifdef USE_INTERNAL_IOBUF
+# define IOBUF_DEFAULT_SIZE	256
+#endif
+
 typedef struct {
   int		ptr;
   int		width;
@@ -66,11 +70,20 @@ typedef struct {
 } find_t;
 
 typedef struct {
+  FILE		*iop;
+#ifdef USE_INTERNAL_IOBUF
+  byte		buf[ IOBUF_DEFAULT_SIZE ];
+  size_t	cur;
+  size_t	last;
+#endif
+} iobuf_t;
+
+typedef struct {
   byte		*fileName;
   i_str_t	*fileNameI18N;
   int		fileNameLength;
-  FILE		*fp;
-  FILE		*sp;
+  iobuf_t	fp;
+  iobuf_t	sp;
   int		pid;
   byte		inputCodingSystem;
   byte		outputCodingSystem;
@@ -137,4 +150,19 @@ public byte *FileName( file_t *f );
 
 public void FileInit();
 
+#ifndef USE_INTERNAL_IOBUF
+# define IobufGetc( a )		getc( (a)->iop )
+# define IobufUngetc( a, b )	ungetc( a, (b)->iop )
+# define IobufFtell( a )	ftell( (a)->iop )
+# define IobufFseek( a, b, c )	fseek( (a)->iop, b, c)
+# define IobufFeof( a )		feof( (a)->iop )
+#else
+public inline int IobufGetc( iobuf_t *iobuf );
+public inline int IobufUngetc( int ch, iobuf_t *iobuf );
+public long IobufFtell( iobuf_t *iobuf );
+public int IobufFseek( iobuf_t *iobuf, long off, int mode );
+public int IobufFeof( iobuf_t *iobuf );
+#endif
+#define IobufPutc( a, b )	putc( a, (b)->iop )
+
 #endif /* __FILE_H__ */