modules/up/src/util/buffer.cc

/* [<][>]
[^][v][top][bottom][index][help] */

FUNCTIONS

This source file includes following functions.
  1. append

   1 //  $Id: buffer.cc,v 1.1.1.1 2000/03/10 16:32:16 engin Exp $
   2 //
   3 //  Copyright (c) 1994 by the University of Southern California
   4 //  All rights reserved.
   5 //
   6 //  Permission to use, copy, modify, and distribute this software and its
   7 //  documentation in source and binary forms for lawful non-commercial
   8 //  purposes and without fee is hereby granted, provided that the above
   9 //  copyright notice appear in all copies and that both the copyright
  10 //  notice and this permission notice appear in supporting documentation,
  11 //  and that any documentation, advertising materials, and other materials
  12 //  related to such distribution and use acknowledge that the software was
  13 //  developed by the University of Southern California, Information
  14 //  Sciences Institute. The name of the USC may not be used to endorse or
  15 //  promote products derived from this software without specific prior
  16 //  written permission.
  17 //
  18 //  THE UNIVERSITY OF SOUTHERN CALIFORNIA DOES NOT MAKE ANY
  19 //  REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE FOR ANY
  20 //  PURPOSE.  THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
  21 //  IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  22 //  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE,
  23 //  TITLE, AND NON-INFRINGEMENT.
  24 //
  25 //  IN NO EVENT SHALL USC, OR ANY OTHER CONTRIBUTOR BE LIABLE FOR ANY
  26 //  SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES, WHETHER IN CONTRACT, TORT,
  27 //  OR OTHER FORM OF ACTION, ARISING OUT OF OR IN CONNECTION WITH, THE USE
  28 //  OR PERFORMANCE OF THIS SOFTWARE.
  29 //
  30 //  Questions concerning this software should be directed to
  31 //  ratoolset@isi.edu.
  32 //
  33 //  Author(s): WeeSan Lee <wlee@ISI.EDU>
  34 
  35 #include "buffer.hh"
  36 
  37 StringBuffer &StringBuffer::append(char *pzcText, unsigned int uiLen)
     /* [<][>][^][v][top][bottom][index][help] */
  38 {
  39   // Check if the buffer is big enuf to hold the whole thing
  40   if (ulEnd + uiLen > capacity())
  41     {
  42     // Calculate the new length
  43     unsigned long ulNewLen = length() + uiLen;
  44     // Check if the new text and old text would fit in the half of 
  45     // the same buffer after being reformed
  46     if ((length() + ulNewLen) <= (capacity() >> 1))
  47       {
  48       // Yes, reform the same old buffer
  49       strcpy(pzcBuffer, pzcBuffer + ulBegin);
  50       // Update some pointers
  51       ulEnd = length();  // Have to do this first before assigning ulBegin
  52       ulBegin = 0;
  53       }
  54     else  // No, allocate a new large buffer to replace the old one
  55       {
  56       // Calculate the new capacity
  57       unsigned long ulNewCapacity = capacity() + PROBE_BUFFER_SIZE;
  58       // If the new capacity is still too small, 
  59       // make use of the new length + PROBE_BUFFER_SIZE
  60       if (ulNewCapacity < ulNewLen) 
  61         ulNewCapacity = ulNewLen + PROBE_BUFFER_SIZE;
  62       // Update the old capacity
  63       ulCapacity = ulNewCapacity;
  64       // Allocate a new buffer
  65       char *pzcTempBuffer = new char [ulNewCapacity + 1];
  66       assert(pzcTempBuffer != NULL);
  67       // Very expensive copy
  68       // Could do strcpy because pzcBuffer + ulEnd is always NULL
  69       strcpy(pzcTempBuffer, pzcBuffer + ulBegin);
  70       // Update some pointers
  71       ulEnd = length();  // Have to do this first before assigning ulBegin
  72       ulBegin = 0;
  73       // Switch buffers
  74       delete []pzcBuffer;
  75       pzcBuffer = pzcTempBuffer;
  76       }
  77     }
  78   // Whew!  The buffer is big enuf 
  79   strncpy(pzcBuffer + ulEnd, pzcText, uiLen);
  80   ulEnd += uiLen;
  81   pzcBuffer[ulEnd] = 0;
  82   return *this;
  83 }

/* [<][>][^][v][top][bottom][index][help] */