poutmem.cxx (1496B)
1 /* 2 * 3 * C++ Portable Types Library (PTypes) 4 * Version 2.1.1 Released 27-Jun-2007 5 * 6 * Copyright (C) 2001-2007 Hovik Melikyan 7 * 8 * http://www.melikyan.com/ptypes/ 9 * 10 */ 11 12 #include "pstreams.h" 13 14 15 namespace ptypes { 16 17 18 outmemory::outmemory(int ilimit) 19 : outstm(false, 0), mem(), limit(ilimit) 20 { 21 } 22 23 24 outmemory::~outmemory() 25 { 26 close(); 27 } 28 29 30 int outmemory::classid() 31 { 32 return CLASS2_OUTMEMORY; 33 } 34 35 36 void outmemory::doopen() 37 { 38 } 39 40 41 void outmemory::doclose() 42 { 43 clear(mem); 44 } 45 46 47 large outmemory::doseek(large newpos, ioseekmode mode) 48 { 49 large pos; 50 51 switch (mode) 52 { 53 case IO_BEGIN: 54 pos = newpos; 55 break; 56 case IO_CURRENT: 57 pos = abspos + newpos; 58 break; 59 default: // case IO_END: 60 pos = length(mem) + newpos; 61 break; 62 } 63 64 if (limit >= 0 && pos > limit) 65 pos = limit; 66 67 return pos; 68 } 69 70 71 int outmemory::dorawwrite(const char* buf, int count) 72 { 73 if (count <= 0) 74 return 0; 75 if (limit >= 0 && abspos + count > limit) 76 { 77 count = limit - (int)abspos; 78 if (count <= 0) 79 return 0; 80 } 81 82 // the string reallocator takes care of efficiency 83 if ((int)abspos + count > length(mem)) 84 setlength(mem, (int)abspos + count); 85 memcpy(pchar(pconst(mem)) + (int)abspos, buf, count); 86 return count; 87 } 88 89 90 string outmemory::get_streamname() 91 { 92 return "mem"; 93 } 94 95 96 string outmemory::get_strdata() 97 { 98 if (!active) 99 errstminactive(); 100 return mem; 101 } 102 103 104 }