1 /*********************************************************************** 2 * * 3 * This software is part of the ast package * 4 * Copyright (c) 1985-2011 AT&T Intellectual Property * 5 * and is licensed under the * 6 * Eclipse Public License, Version 1.0 * 7 * by AT&T Intellectual Property * 8 * * 9 * A copy of the License is available at * 10 * http://www.eclipse.org/org/documents/epl-v10.html * 11 * (with md5 checksum b35adb5213ca9657e911e9befb180842) * 12 * * 13 * Information and Software Systems Research * 14 * AT&T Research * 15 * Florham Park NJ * 16 * * 17 * Glenn Fowler <gsf@research.att.com> * 18 * David Korn <dgk@research.att.com> * 19 * Phong Vo <kpv@research.att.com> * 20 * * 21 ***********************************************************************/ 22 #include "sfhdr.h" 23 24 /* Resize a stream. 25 Written by Kiem-Phong Vo. 26 */ 27 28 #if __STD_C 29 int sfresize(Sfio_t* f, Sfoff_t size) 30 #else 31 int sfresize(f, size) 32 Sfio_t* f; 33 Sfoff_t size; 34 #endif 35 { 36 SFMTXDECL(f); 37 38 SFMTXENTER(f, -1); 39 40 if(size < 0 || f->extent < 0 || 41 (f->mode != SF_WRITE && _sfmode(f,SF_WRITE,0) < 0) ) 42 SFMTXRETURN(f, -1); 43 44 SFLOCK(f,0); 45 46 if(f->flags&SF_STRING) 47 { SFSTRSIZE(f); 48 49 if(f->extent >= size) 50 { if((f->flags&SF_MALLOC) && (f->next - f->data) <= size) 51 { size_t s = (((size_t)size + 1023)/1024)*1024; 52 Void_t* d; 53 if(s < f->size && (d = realloc(f->data, s)) ) 54 { f->data = d; 55 f->size = s; 56 f->extent = s; 57 } 58 } 59 memclear((char*)(f->data+size), (int)(f->extent-size)); 60 } 61 else 62 { if(SFSK(f, size, SEEK_SET, f->disc) != size) 63 SFMTXRETURN(f, -1); 64 memclear((char*)(f->data+f->extent), (int)(size-f->extent)); 65 } 66 } 67 else 68 { if(f->next > f->data) 69 SFSYNC(f); 70 #if _lib_ftruncate 71 if(ftruncate(f->file, (sfoff_t)size) < 0) 72 SFMTXRETURN(f, -1); 73 #else 74 SFMTXRETURN(f, -1); 75 #endif 76 } 77 78 f->extent = size; 79 80 SFOPEN(f, 0); 81 82 SFMTXRETURN(f, 0); 83 } 84