util: Allow to define the maximum file size.
authorJosé Fonseca <jrfonseca@tungstengraphics.com>
Mon, 8 Sep 2008 13:56:38 +0000 (22:56 +0900)
committerJosé Fonseca <jrfonseca@tungstengraphics.com>
Mon, 8 Sep 2008 13:56:38 +0000 (22:56 +0900)
This avoids splitting the bitmaps in many files.

src/gallium/auxiliary/util/p_debug.c
src/gallium/auxiliary/util/u_stream.h
src/gallium/auxiliary/util/u_stream_stdc.c
src/gallium/auxiliary/util/u_stream_wd.c

index 131e9b026c475f1dca213e111b98e003db81d2aa..b6cff281e6dcf6606ca81adb04d82296da88ad3c 100644 (file)
@@ -657,7 +657,7 @@ debug_dump_surface_bmp(const char *filename,
    bmih.biClrUsed = 0;
    bmih.biClrImportant = 0;
    
-   stream = util_stream_create(filename);
+   stream = util_stream_create(filename, bmfh.bfSize);
    if(!stream)
       goto error2;
    
index 516e634a9904614fe0d1e5808fef0290f239fd93..a9d0f0121a656051a612e0c9371b883af0432093 100644 (file)
 struct util_stream;
 
 
+/**
+ * Create a stream
+ * @param filename relative or absolute path (necessary for windows)  
+ * @param optional maximum file size (0 for a growable size).
+ */
 struct util_stream *
-util_stream_create(const char *filename);
+util_stream_create(const char *filename, size_t max_size);
 
 boolean
 util_stream_write(struct util_stream *stream, const void *data, size_t size);
index 03c845b6a7800d3f1c44a7b8ab4143e11acb40cb..dfb6a0e647b6ee26caa52601d8a366837d9959c1 100644 (file)
@@ -48,10 +48,12 @@ struct util_stream
 
 
 struct util_stream *
-util_stream_create(const char *filename)
+util_stream_create(const char *filename, size_t max_size)
 {
    struct util_stream *stream;
    
+   (void)max_size;
+   
    stream = CALLOC_STRUCT(util_stream);
    if(!stream)
       goto error1;
index c8bb2ad0117943c81d1e16e0864fc5e0ade32dc2..1e135c6ba06073d1ede2a371bf26f40bff4365cd 100644 (file)
@@ -50,6 +50,8 @@ struct util_stream
 {
    char filename[MAX_PATH + 1];
    WCHAR wFileName[MAX_PATH + 1];
+   boolean growable;
+   size_t map_size;
    ULONG_PTR iFile;
    char *pMap;
    size_t written;
@@ -64,11 +66,17 @@ util_stream_map(struct util_stream *stream)
    static char filename[MAX_PATH + 1];
    unsigned filename_len;
 
-   filename_len = util_snprintf(filename,
-                                sizeof(filename),
-                                "\\??\\%s.%04x",
-                                stream->filename,
-                                stream->suffix++);
+   if(stream->growable)
+      filename_len = util_snprintf(filename,
+                                   sizeof(filename),
+                                   "\\??\\%s.%04x",
+                                   stream->filename,
+                                   stream->suffix++);
+   else
+      filename_len = util_snprintf(filename,
+                                   sizeof(filename),
+                                   "\\??\\%s",
+                                   stream->filename);
 
    EngMultiByteToUnicodeN(
          stream->wFileName,
@@ -77,11 +85,11 @@ util_stream_map(struct util_stream *stream)
          filename,
          filename_len);
    
-   stream->pMap = EngMapFile(stream->wFileName, MAP_FILE_SIZE, &stream->iFile);
+   stream->pMap = EngMapFile(stream->wFileName, stream->map_size, &stream->iFile);
    if(!stream->pMap)
       return FALSE;
    
-   memset(stream->pMap, 0, MAP_FILE_SIZE);
+   memset(stream->pMap, 0, stream->map_size);
    stream->written = 0;
    
    return TRUE;
@@ -92,7 +100,7 @@ static INLINE void
 util_stream_unmap(struct util_stream *stream)
 {
    EngUnmapFile(stream->iFile);
-   if(stream->written < MAP_FILE_SIZE) {
+   if(stream->written < stream->map_size) {
       /* Truncate file size */
       stream->pMap = EngMapFile(stream->wFileName, stream->written, &stream->iFile);
       if(stream->pMap)
@@ -104,7 +112,7 @@ util_stream_unmap(struct util_stream *stream)
 
 
 struct util_stream *
-util_stream_create(const char *filename)
+util_stream_create(const char *filename, size_t max_size)
 {
    struct util_stream *stream;
    
@@ -114,6 +122,15 @@ util_stream_create(const char *filename)
    
    strncpy(stream->filename, filename, sizeof(stream->filename));
    
+   if(max_size) {
+      stream->growable = FALSE;
+      stream->map_size = max_size;
+   }
+   else {
+      stream->growable = TRUE;
+      stream->map_size = MAP_FILE_SIZE;
+   }
+   
    if(!util_stream_map(stream))
       goto error2;
    
@@ -129,7 +146,7 @@ error1:
 static INLINE void
 util_stream_copy(struct util_stream *stream, const char *data, size_t size)
 {
-   assert(stream->written + size <= MAP_FILE_SIZE);
+   assert(stream->written + size <= stream->map_size);
    memcpy(stream->pMap + stream->written, data, size);
    stream->written += size;
 }
@@ -144,14 +161,14 @@ util_stream_write(struct util_stream *stream, const void *data, size_t size)
    if(!stream->pMap)
       return FALSE;
    
-   while(stream->written + size > MAP_FILE_SIZE) {
-      size_t step = MAP_FILE_SIZE - stream->written;
+   while(stream->written + size > stream->map_size) {
+      size_t step = stream->map_size - stream->written;
       util_stream_copy(stream, data, step);
       data = (const char *)data + step;
       size -= step;
       
       util_stream_unmap(stream);
-      if(!util_stream_map(stream))
+      if(!stream->growable || !util_stream_map(stream))
          return FALSE;
    }