]> git.donarmstrong.com Git - lilypond.git/blobdiff - lib/source-file.cc
release: 0.1.13
[lilypond.git] / lib / source-file.cc
index 8f28f9b5f5bb857b5776f41c0f38da662f65426c..dc6c092519a66eaec827c602ebc3a3cd7d8dbf3c 100644 (file)
-//
-// source-file.cc
-//
-
-#include <sys/types.h>         // open, mmap
-#include <sys/stat.h>          // open
-#include <sys/mman.h>          // mmap
-#include <limits.h>            // INT_MAX
-#include <fcntl.h>             // open 
-#include <unistd.h>            // close, stat
-#include <stdio.h>             // fdopen
-#include <string.h>            // strerror
-#include <errno.h>             // errno
+/*
+  source-file.cc -- implement Source_file
+
+  source file of the GNU LilyPond music typesetter
+
+  (c) 1997 Jan Nieuwenhuizen <jan@digicash.com> 
+  & Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+
 #include <assert.h>
 #include <strstream.h>
 
 #include "string.hh"
 #include "proto.hh"
 #include "plist.hh"
-
-
 #include "warn.hh"
 #include "windhoos-suck-suck-suck-thank-you-cygnus.hh"
-
 #include "source-file.hh"
+#include "file-storage.hh"
 
-Source_file::Source_file( String filename_str )
+Source_file::Source_file(String filename_str)
 {
-    data_caddr_ = 0;
-    fildes_i_ = 0;
-    size_off_ = 0;
-    name_str_ = filename_str;
-    istream_p_ = 0;
-
-    open();
-    if ( fildes_i_ > 0 )
-       map();
+  name_str_ = filename_str;
+  istream_p_ = 0;
+  storage_p_ = new Simple_file_storage(filename_str);
 }
 
 istream*
 Source_file::istream_l()
 {
-    if ( !fildes_i_ )
-       return &cin;
-    if ( !istream_p_ ) {
-       if ( size_off_ ) // can-t this be done without such a hack?
-           istream_p_ = new istrstream( ch_C(), size_off_ );
-        else {
-           istream_p_ = new istrstream( "", 0 );
-           istream_p_->set(ios::eofbit);
+  /*
+    if (!name_str_.length_i())
+      return &cin;
+    */
+  
+  if (!istream_p_) 
+    {
+      if (length_i()) // can-t this be done without such a hack?
+       istream_p_ = new istrstream(ch_C(), length_i());
+      else 
+       {
+         istream_p_ = new istrstream("", 0);
+         istream_p_->set(ios::eofbit);
        }
     }
-    return istream_p_;
+  return istream_p_;
 }
 
-Source_file::~Source_file()
+String
+Source_file::file_line_no_str(char const *context_ch_C) const
 {
-    delete istream_p_;
-    istream_p_ = 0;
-    unmap();
-    close();
+  if  (!ch_C())
+    return "(unknown)";
+  else
+    return name_str() + ": "
+      + String(line_i(context_ch_C));
 }
 
-char const*
-Source_file::ch_C()
+String
+Source_file::name_str() const
 {
-    assert( this );
-    return (char const*)data_caddr_;
+  return name_str_;
 }
 
-void
-Source_file::close()
+Source_file::~Source_file()
 {
-    if ( fildes_i_ ) {
-       ::close( fildes_i_ );
-       fildes_i_ = 0;
-    }
+  delete istream_p_;
+  istream_p_ = 0;
+  delete storage_p_;
 }
 
 String
-Source_file::error_str( char const* pos_ch_C )
+Source_file::error_str(char const* pos_ch_C) const
 {
-    char const* data_ch_C = ch_C();
-    char const * eof_C_ = data_ch_C + size_off_;
-    if ( !in_b( pos_ch_C ) )
-       return "(position unknown)";
+  char const* data_ch_C = ch_C();
+  char const * eof_C_ = data_ch_C + length_i();
+  if (!in_b(pos_ch_C))
+    return "(position unknown)";
 
     
-    if ( pos_ch_C == eof_C_)
-       pos_ch_C --;
-    char const* begin_ch_C = pos_ch_C;
-    while ( begin_ch_C > data_ch_C )
-        if ( *--begin_ch_C == '\n' ) {
-           begin_ch_C++;
-           break;
-       }
-
-    char const* end_ch_C = pos_ch_C;
-    while ( end_ch_C < eof_C_ )
-        if ( *end_ch_C++ == '\n' ) {
-         end_ch_C--;
-         break;
-       }
+  if (pos_ch_C == eof_C_)
+    pos_ch_C --;
+  char const* begin_ch_C = pos_ch_C;
+  while (begin_ch_C > data_ch_C)
+    if (*--begin_ch_C == '\n') 
+      {
+       begin_ch_C++;
+       break;
+      }
+
+  char const* end_ch_C = pos_ch_C;
+  while (end_ch_C < eof_C_)
+    if (*end_ch_C++ == '\n') 
+      {
+       end_ch_C--;
+       break;
+      }
   
-       //    String( char const* p, int length ) is missing!?
-    String line_str( (Byte const*)begin_ch_C, end_ch_C - begin_ch_C );
-
-    int error_col_i = 0;
-    char const* scan_ch_C = begin_ch_C;
-    while ( scan_ch_C < pos_ch_C )
-       if ( *scan_ch_C++ == '\t' )
-           error_col_i = ( error_col_i / 8 + 1 ) * 8;
-       else
-           error_col_i++;
-
-    String str = line_str.left_str( pos_ch_C - begin_ch_C 
-       + String( '\n' )
-       + String( ' ', error_col_i 
-       + line_str.mid_str( pos_ch_C - begin_ch_C, INT_MAX ); // String::mid should take 0 arg..
-    return str;
+  //    String(char const* p, int length) is missing!?
+  String line_str((Byte const*)begin_ch_C, end_ch_C - begin_ch_C);
+
+  int error_col_i = 0;
+  char const* scan_ch_C = begin_ch_C;
+  while (scan_ch_C < pos_ch_C)
+    if (*scan_ch_C++ == '\t')
+      error_col_i = (error_col_i / 8 + 1) * 8;
+    else
+      error_col_i++;
+
+  String str = line_str.left_str(pos_ch_C - begin_ch_C
+    + String('\n')
+    + String(' ', error_col_i
+    + line_str.mid_str(pos_ch_C - begin_ch_C, INT_MAX); // String::mid should take 0 arg..
+  return str;
 }
 
 bool
-Source_file::in_b( char const* pos_ch_C )
+Source_file::in_b(char const* pos_ch_C) const
 {
-    return ( pos_ch_C && ( pos_ch_C >= ch_C() ) && ( pos_ch_C <= ch_C() + size_off_ ) );
+  return (pos_ch_C && (pos_ch_C >= ch_C()) && (pos_ch_C <= ch_C() + length_i()));
 }
 
-off_t
-Source_file::length_off()
-{
-    return size_off_;
-}
 
 int
-Source_file::line_i( char const* pos_ch_C )
+Source_file::line_i(char const* pos_ch_C) const
 {
-    if ( !in_b( pos_ch_C ) )
-       return 0;
-
-    int i = 1;
-    char const* scan_ch_C = ch_C();
-    while ( scan_ch_C < pos_ch_C )
-       if ( *scan_ch_C++ == '\n' )
-               i++;
-    return i;
-}
-
-void
-Source_file::map()
-{
-    if ( fildes_i_ == -1 )
-       return;
+  if (!in_b(pos_ch_C))
+    return 0;
 
-    data_caddr_ = (caddr_t)mmap( (void*)0, size_off_, PROT_READ, MAP_SHARED, fildes_i_, 0 );
-
-    if ( (int)data_caddr_ == -1 )
-       warning( String( "can't map: " ) + name_str_ + String( ": " ) + strerror( errno ));
+  int i = 1;
+  char const* scan_ch_C = ch_C();
+  if (!scan_ch_C)
+    return 0;
+    
+  while (scan_ch_C < pos_ch_C)
+    if (*scan_ch_C++ == '\n')
+      i++;
+  return i;
 }
 
-String
-Source_file::name_str()
+int
+Source_file::length_i() const
 {
-    return name_str_;
+  return storage_p_->length_i();
 }
 
-void
-Source_file::open()
+char const *
+Source_file::ch_C() const
 {
-    if ( !name_str_.length_i() || ( name_str_ == "-" ) ) {
-       fildes_i_ = 0;
-       return;
-    }
-
-    fildes_i_ = ::open( name_str_, O_RDONLY ); 
-           
-    if ( fildes_i_ == -1 ) {
-       warning( String( "can't open: " ) + name_str_ + String( ": " ) + strerror( errno )); 
-        return;
-    }
-
-    struct stat file_stat;
-    fstat( fildes_i_, &file_stat );
-    size_off_ = file_stat.st_size;
-}
-
-void
-Source_file::unmap()
-{
-    if ( data_caddr_ ) {
-       munmap( data_caddr_, size_off_ );
-       data_caddr_ = 0;
-       size_off_ = 0;
-    }
-}
-String
-Source_file::file_line_no_str(char const *ch_C )
-{
-    return name_str() + ": "
-       + String( line_i( ch_C ) );
+  return storage_p_->ch_C();
 }