]> git.donarmstrong.com Git - lilypond.git/blob - flower/mapped-file-storage.cc
``slikken kreng''
[lilypond.git] / flower / mapped-file-storage.cc
1 #ifdef HAIRY_STUFF
2
3 /*
4   file-storage.cc -- implement Mapped_file_storage
5
6   source file of the GNU LilyPond music typesetter
7
8   (c)  1997--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
9   Jan Nieuwenhuizen <janneke@gnu.org>.
10
11   Nextstep fixes by tiggr@ics.ele.tue.nl
12 */
13
14 #include <sys/types.h>          // open, mmap
15 #include <sys/stat.h>           // open
16 #include <sys/mman.h>           // mmap
17 #include <limits.h>             // INT_MAX
18 #include <fcntl.h>              // open
19 #include <unistd.h>             // close, stat
20 #include <stdio.h>              // fdopen
21 #include <string.h>             // strerror
22 #include <errno.h>              // errno
23
24
25
26 #ifdef __NeXT__
27 #include <mach/mach.h>
28 #include <mach/mach_traps.h>
29 #include <mach/mach_error.h>
30 #endif
31
32 #include "string.hh"
33 #include "flower-proto.hh"
34 #include "warn.hh"
35 #include "file-storage.hh"
36
37 Mapped_file_storage::Mapped_file_storage (String s)
38 {
39   data_caddr_ = 0;
40   fildes_ = 0;
41   size_off_ = 0;
42   open (s);
43 }
44
45 char const*
46 Mapped_file_storage::to_str0 () const
47 {
48   return (char const*)data_caddr_;
49 }
50
51 void
52 Mapped_file_storage::map ()
53 {
54   if (fildes_ == -1)
55     return;
56   
57 #ifdef __NeXT__
58    /* Should be #if !HAVE_MMAP && HAVE_MAP_FD...  */
59    {
60      vm_offset_t address;
61      kern_return_t r;
62  
63      r = map_fd (fildes_, (vm_offset_t) 0, &address, TRUE, size_off_);
64      if (r != KERN_SUCCESS)
65        warning (String ("map_fd: ") + mach_error_string (r));
66      else
67        data_caddr_ = (char *) address;
68    }
69 #else
70
71   data_caddr_ = (caddr_t)mmap ((void*)0, size_off_, PROT_READ, MAP_SHARED, fildes_, 0);
72
73   if ((int)data_caddr_ == -1)
74     warning (_ ("can't map file") + ": " + strerror (errno));
75
76 #endif
77 }
78
79
80 void
81 Mapped_file_storage::open (String name_string)
82 {
83   fildes_ = ::open (name_string.to_str0 (), O_RDONLY);
84
85   if (fildes_ == -1)
86     {
87       warning (_f ("can't open file: `%s'", name_string)
88         + ": " + strerror (errno));
89       return;
90     }
91
92   struct stat file_stat;
93   fstat (fildes_, &file_stat);
94   size_off_ = file_stat.st_size;
95   map ();
96 }
97
98 void
99 Mapped_file_storage::unmap ()
100 {
101   if (data_caddr_)
102     {
103 #ifdef __NeXT__
104        kern_return_t r;
105  
106        r = vm_deallocate (task_self (), (vm_address_t) data_caddr_, 
107 size_off_);
108        if (r != KERN_SUCCESS)
109        warning (String ("vm_deallocate: ") + mach_error_string (r));
110 #else
111        munmap (data_caddr_, size_off_);
112 #endif
113        
114       data_caddr_ = 0;
115       size_off_ = 0;
116     }
117 }
118
119 void
120 Mapped_file_storage::close ()
121 {
122   unmap ();
123   if (fildes_)
124     {
125       ::close (fildes_);
126       fildes_ = 0;
127     }
128 }
129
130 int
131 Mapped_file_storage::length () const
132 {
133   return size_off_;
134 }
135
136 Mapped_file_storage::~Mapped_file_storage ()
137 {
138   close ();
139 }
140 #endif