Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/trunk/src/runtime/gc/mem-writer.c
ViewVC logotype

Annotation of /sml/trunk/src/runtime/gc/mem-writer.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 249 - (view) (download) (as text)
Original Path: sml/branches/SMLNJ/src/runtime/gc/mem-writer.c

1 : monnier 249 /* mem-writer.c
2 :     *
3 :     * COPYRIGHT (c) 1995 AT&T Bell Laboratories.
4 :     *
5 :     * An implementation of the abstract writers on top of memory regions.
6 :     */
7 :    
8 :     #include "ml-base.h"
9 :     #include "writer.h"
10 :    
11 :     #ifndef BUFSIZ
12 :     #define BUFSIZ 4096
13 :     #endif
14 :    
15 :     typedef struct buffer {
16 :     Byte_t *base;
17 :     Byte_t *next;
18 :     Byte_t *top;
19 :     } wr_buffer_t;
20 :    
21 :     PVT void Put (writer_t *wr, Word_t w);
22 :     PVT void Write (writer_t *wr, const void *data, Addr_t nbytes);
23 :     PVT void Flush (writer_t *wr);
24 :     PVT long Tell (writer_t *wr);
25 :     PVT void Seek (writer_t *wr, long offset);
26 :     PVT void Free (writer_t *wr);
27 :    
28 :     #define BufOf(wr) ((wr_buffer_t *)((wr)->data))
29 :    
30 :     /* WR_OpenMem:
31 :     *
32 :     * Open a file for writing, and make a writer for it.
33 :     */
34 :     writer_t *WR_OpenMem (Byte_t *data, Addr_t len)
35 :     {
36 :     wr_buffer_t *bp;
37 :     writer_t *wr;
38 :    
39 :     bp = NEW_OBJ(wr_buffer_t);
40 :     bp->base = data;
41 :     bp->next = data;
42 :     bp->top = (Byte_t *)(((Addr_t)data) + len);
43 :    
44 :     wr = NEW_OBJ(writer_t);
45 :     wr->errFlg = FALSE;
46 :     wr->data = (void *)bp;
47 :     wr->putWord = Put;
48 :     wr->write = Write;
49 :     wr->flush = Flush;
50 :     wr->tell = Tell;
51 :     wr->seek = Seek;
52 :     wr->free = Free;
53 :    
54 :     return wr;
55 :    
56 :     } /* end of WR_OpenMem */
57 :    
58 :     /* Put:
59 :     */
60 :     PVT void Put (writer_t *wr, Word_t w)
61 :     {
62 :     wr_buffer_t *bp = BufOf(wr);
63 :    
64 :     ASSERT(bp->next+WORD_SZB <= bp->top);
65 :    
66 :     *((Word_t *)(bp->next)) = w;
67 :     bp->next += WORD_SZB;
68 :    
69 :     } /* end of Put */
70 :    
71 :     /* Write:
72 :     */
73 :     PVT void Write (writer_t *wr, const void *data, Addr_t nbytes)
74 :     {
75 :     wr_buffer_t *bp = BufOf(wr);
76 :    
77 :     if (wr->errFlg)
78 :     return;
79 :    
80 :     ASSERT(bp->next+nbytes <= bp->top);
81 :    
82 :     memcpy (bp->next, data, nbytes);
83 :     bp->next += nbytes;
84 :    
85 :     } /* end of Write */
86 :    
87 :     /* Flush:
88 :     */
89 :     PVT void Flush (writer_t *wr)
90 :     {
91 :     wr_buffer_t *bp = BufOf(wr);
92 :    
93 :     ASSERT(bp->next <= bp->top);
94 :    
95 :     } /* end of Flush */
96 :    
97 :     /* Tell:
98 :     */
99 :     PVT long Tell (writer_t *wr)
100 :     {
101 :     Die ("Tell not supported on memory writers");
102 :    
103 :     } /* end of Tell */
104 :    
105 :     /* Seek:
106 :     */
107 :     PVT void Seek (writer_t *wr, long offset)
108 :     {
109 :     Die ("Tell not supported on memory writers");
110 :    
111 :     } /* end of Seek */
112 :    
113 :     /* Free:
114 :     */
115 :     PVT void Free (writer_t *wr)
116 :     {
117 :     wr_buffer_t *bp = BufOf(wr);
118 :    
119 :     ASSERT(bp->next == bp->top);
120 :    
121 :     FREE (BufOf(wr));
122 :     FREE (wr);
123 :    
124 :     } /* end of Free */

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0