sfresize.c revision 1
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster/***********************************************************************
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster* *
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster* This software is part of the ast package *
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster* Copyright (c) 1985-2011 AT&T Intellectual Property *
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster* and is licensed under the *
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster* Common Public License, Version 1.0 *
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster* by AT&T Intellectual Property *
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster* *
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster* A copy of the License is available at *
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster* http://www.opensource.org/licenses/cpl1.0.txt *
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster* *
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster* Information and Software Systems Research *
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster* AT&T Research *
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster* Florham Park NJ *
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster* *
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster* Glenn Fowler <gsf@research.att.com> *
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster* David Korn <dgk@research.att.com> *
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster* Phong Vo <kpv@research.att.com> *
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster* *
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster***********************************************************************/
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster#include "sfhdr.h"
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster/* Resize a stream.
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster Written by Kiem-Phong Vo.
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster*/
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster#if __STD_C
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Fosterint sfresize(Sfio_t* f, Sfoff_t size)
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster#else
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Fosterint sfresize(f, size)
5c099afa7c9361afc2f4477fec0e3018588d7840Allan FosterSfio_t* f;
c4329510051cce0c6b3efc1fae122ec4c5d61efaDavid LunaSfoff_t size;
c4329510051cce0c6b3efc1fae122ec4c5d61efaDavid Luna#endif
c4329510051cce0c6b3efc1fae122ec4c5d61efaDavid Luna{
c4329510051cce0c6b3efc1fae122ec4c5d61efaDavid Luna SFMTXDECL(f);
c4329510051cce0c6b3efc1fae122ec4c5d61efaDavid Luna
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster SFMTXENTER(f, -1);
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster if(size < 0 || f->extent < 0 ||
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster (f->mode != SF_WRITE && _sfmode(f,SF_WRITE,0) < 0) )
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster SFMTXRETURN(f, -1);
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster
c4329510051cce0c6b3efc1fae122ec4c5d61efaDavid Luna SFLOCK(f,0);
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster if(f->flags&SF_STRING)
c4329510051cce0c6b3efc1fae122ec4c5d61efaDavid Luna { SFSTRSIZE(f);
c4329510051cce0c6b3efc1fae122ec4c5d61efaDavid Luna
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster if(f->extent >= size)
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster { if((f->flags&SF_MALLOC) && (f->next - f->data) <= size)
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster { size_t s = (((size_t)size + 1023)/1024)*1024;
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster Void_t* d;
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster if(s < f->size && (d = realloc(f->data, s)) )
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster { f->data = d;
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster f->size = s;
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster f->extent = s;
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster }
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster }
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster memclear((char*)(f->data+size), (int)(f->extent-size));
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster }
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster else
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster { if(SFSK(f, size, SEEK_SET, f->disc) != size)
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster SFMTXRETURN(f, -1);
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster memclear((char*)(f->data+f->extent), (int)(size-f->extent));
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster }
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster }
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster else
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster { if(f->next > f->data)
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster SFSYNC(f);
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster#if _lib_ftruncate
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster if(ftruncate(f->file, (sfoff_t)size) < 0)
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster SFMTXRETURN(f, -1);
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster#else
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster SFMTXRETURN(f, -1);
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster#endif
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster }
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster f->extent = size;
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster SFOPEN(f, 0);
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster SFMTXRETURN(f, 0);
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster}
5c099afa7c9361afc2f4477fec0e3018588d7840Allan Foster