StackBuffer.c++
上传用户:weiyuanprp
上传日期:2020-05-20
资源大小:1169k
文件大小:3k
源码类别:

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: StackBuffer.c++,v 1.1.1.1 2005/11/11 21:32:03 faxguy Exp $ */
  2. /*
  3.  * Copyright (c) 1990-1996 Sam Leffler
  4.  * Copyright (c) 1991-1996 Silicon Graphics, Inc.
  5.  * HylaFAX is a trademark of Silicon Graphics
  6.  *
  7.  * Permission to use, copy, modify, distribute, and sell this software and 
  8.  * its documentation for any purpose is hereby granted without fee, provided
  9.  * that (i) the above copyright notices and this permission notice appear in
  10.  * all copies of the software and related documentation, and (ii) the names of
  11.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  12.  * publicity relating to the software without the specific, prior written
  13.  * permission of Sam Leffler and Silicon Graphics.
  14.  * 
  15.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  16.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  17.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  18.  * 
  19.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  20.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  21.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  22.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  23.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  24.  * OF THIS SOFTWARE.
  25.  */
  26. #include "StackBuffer.h"
  27. #include "Str.h"
  28. #include <stdlib.h>
  29. fxStackBuffer::fxStackBuffer(u_int grow)
  30. {
  31.     base = next = buf;
  32.     end = &buf[sizeof(buf)];
  33.     amountToGrowBy = grow ? grow : 500;
  34. }
  35. fxStackBuffer::~fxStackBuffer()
  36. {
  37.     if (base != buf) free(base);
  38. }
  39. fxStackBuffer::fxStackBuffer(const fxStackBuffer& other)
  40. {
  41.     u_int size = other.end - other.base;
  42.     u_int len = other.getLength();
  43.     if (size > sizeof(buf)) {
  44. base = (char*) malloc(size);
  45.     } else {
  46. base = &buf[0];
  47.     }
  48.     end = base + size;
  49.     next = base + len;
  50.     memcpy(base, other.base, len);
  51. }
  52. void
  53. fxStackBuffer::addc(char c)
  54. {
  55.     if (next >= end) {
  56. grow(amountToGrowBy);
  57.     }
  58.     *next++ = c;
  59. }
  60. void
  61. fxStackBuffer::grow(u_int amount)
  62. {
  63.     // insure an acceptable amount of growth
  64.     if (amount < amountToGrowBy) amount = amountToGrowBy;
  65.     // move data into larger piece of memory
  66.     u_int size = end - base;
  67.     u_int len = getLength();
  68.     u_int newSize = size + amount;
  69.     if (base == buf) {
  70. base = (char*) malloc(newSize);
  71. memcpy(base, buf, sizeof(buf));
  72.     } else {
  73. base = (char*) realloc(base, newSize);
  74.     }
  75.     // update position pointers
  76.     end = base + newSize;
  77.     next = base + len;
  78. }
  79. void
  80. fxStackBuffer::put(char const* c, u_int len)
  81. {
  82.     u_int remainingSpace = end - next;
  83.     if  (len > remainingSpace) {
  84. grow(len - remainingSpace);
  85.     }
  86.     memcpy(next, c, len);
  87.     next += len;
  88. }
  89. void
  90. fxStackBuffer::put(const fxStr& s)
  91. {
  92.     put(s, s.length());
  93. }
  94. void
  95. fxStackBuffer::vput(const char* fmt, va_list ap)
  96. {
  97.     put(fxStr::vformat(fmt, ap));
  98. }
  99. void
  100. fxStackBuffer::fput(const char* fmt ...)
  101. {
  102.     va_list ap;
  103.     va_start(ap, fmt);
  104.     vput(fmt, ap);
  105.     va_end(ap);
  106. }
  107. fxStackBuffer& fxStackBuffer::operator=(const fxStackBuffer& other)
  108. {
  109.     if (&other != this) {
  110.         u_int size = other.end - other.base;
  111.         u_int len = other.getLength();
  112.         if (base != buf) free(base);
  113.         base = (size > sizeof(buf)) ? (char*) malloc(size) : &buf[0];
  114.         end = base + size;
  115.         next = base + len;
  116.         memcpy(base, other.base, len);
  117.    }
  118.    return *this;
  119. }