MutableBufferClass.hpp
Go to the documentation of this file.
1 /*----------------------------------------------------------------------------*/
2 /* */
3 /* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */
4 /* Copyright (c) 2005-2009 Rexx Language Association. All rights reserved. */
5 /* */
6 /* This program and the accompanying materials are made available under */
7 /* the terms of the Common Public License v1.0 which accompanies this */
8 /* distribution. A copy is also available at the following address: */
9 /* http://www.oorexx.org/license.html */
10 /* */
11 /* Redistribution and use in source and binary forms, with or */
12 /* without modification, are permitted provided that the following */
13 /* conditions are met: */
14 /* */
15 /* Redistributions of source code must retain the above copyright */
16 /* notice, this list of conditions and the following disclaimer. */
17 /* Redistributions in binary form must reproduce the above copyright */
18 /* notice, this list of conditions and the following disclaimer in */
19 /* the documentation and/or other materials provided with the distribution. */
20 /* */
21 /* Neither the name of Rexx Language Association nor the names */
22 /* of its contributors may be used to endorse or promote products */
23 /* derived from this software without specific prior written permission. */
24 /* */
25 /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */
26 /* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */
27 /* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */
28 /* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */
29 /* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */
30 /* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */
31 /* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */
32 /* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */
33 /* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */
34 /* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */
35 /* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
36 /* */
37 /*----------------------------------------------------------------------------*/
38 /******************************************************************************/
39 /* REXX Kernel MutableBufferClass.hpp */
40 /* */
41 /* Primitive MutableBuffer Class Definition */
42 /* */
43 /******************************************************************************/
44 #ifndef Included_RexxMutableBuffer
45 #define Included_RexxMutableBuffer
46 
47 #include "StringClass.hpp"
48 #include "IntegerClass.hpp"
49 #include "BufferClass.hpp"
50 
51 class RexxMutableBuffer;
52 class RexxClass;
53 
55  public:
56  RexxMutableBufferClass(RESTORETYPE restoreType) { ; };
57  void *operator new(size_t size, void *ptr) { return ptr; };
58  RexxMutableBuffer *newRexx(RexxObject**, size_t, size_t); // in behaviour
59 };
60 
61  class RexxMutableBuffer : public RexxObject {
62  friend class RexxMutableBufferClass;
63  public:
64  inline void *operator new(size_t size, void *ptr){return ptr;};
65  void *operator new(size_t size, RexxClass *bufferClass);
66  void *operator new(size_t size);
69  inline RexxMutableBuffer(RESTORETYPE restoreType) { ; };
70 
71  void live(size_t);
72  void liveGeneral(int reason);
73  void flatten(RexxEnvelope *envelope);
74 
75  RexxObject *copy();
76  void ensureCapacity(sizeB_t addedLength);
77 
78  RexxObject *lengthRexx(); // in behaviour
79 
80  RexxMutableBuffer *append(RexxObject*); // in behaviour
81  RexxMutableBuffer *appendCstring(const char*, sizeB_t blength); // Must not overload append : would generate error cannot convert from 'overloaded-function' to 'PCPPM' in memory/setup.cpp
84  RexxMutableBuffer *replaceAt(RexxObject *str, RexxObject *pos, RexxObject *len, RexxObject *pad); // in behaviour
85  RexxMutableBuffer *mydelete(RexxObject*, RexxObject*); // in behaviour
86  RexxString *substr(RexxInteger *startPosition, RexxInteger *len, RexxString *pad); // in behaviour
87  RexxInteger *lastPos(RexxString *needle, RexxInteger *_start, RexxInteger *_range); // in behaviour
88  RexxInteger *posRexx(RexxString *needle, RexxInteger *_start, RexxInteger *_range); // in behaviour
89  RexxInteger *caselessLastPos(RexxString *needle, RexxInteger *_start, RexxInteger *_range); // in behaviour
90  RexxInteger *caselessPos(RexxString *needle, RexxInteger *_start, RexxInteger *_range); // in behaviour
91  RexxString *subchar(RexxInteger *startPosition); // in behaviour
92 
93  RexxInteger *getBufferSize() { return new_integer(bufferLength); } // in behaviour
94  RexxObject *setBufferSize(RexxInteger*); // in behaviour
95  RexxArray *makeArrayRexx(RexxString *div); // in behaviour
99  RexxInteger *countStrRexx(RexxString *needle); // in behaviour
100  RexxInteger *caselessCountStrRexx(RexxString *needle); // in behaviour
101  RexxMutableBuffer *changeStr(RexxString *needle, RexxString *newNeedle, RexxInteger *countArg); // in behaviour
102  RexxMutableBuffer *caselessChangeStr(RexxString *needle, RexxString *newNeedle, RexxInteger *countArg); // in behaviour
103  RexxMutableBuffer *upper(RexxInteger *_start, RexxInteger *_length); // in behaviour
104  RexxMutableBuffer *lower(RexxInteger *_start, RexxInteger *_length); // in behaviour
105  RexxMutableBuffer *translate(RexxString *tableo, RexxString *tablei, RexxString *pad, RexxInteger *, RexxInteger *); // in behaviour
106  RexxInteger *match(RexxInteger *start_, RexxString *other, RexxInteger *offset_, RexxInteger *len_); // in behaviour
107  RexxInteger *caselessMatch(RexxInteger *start_, RexxString *other, RexxInteger *offset_, RexxInteger *len_); // in behaviour
110  RexxInteger *matchChar(RexxInteger *position_, RexxString *matchSet); // in behaviour
111  RexxInteger *caselessMatchChar(RexxInteger *position_, RexxString *matchSet); // in behaviour
112  RexxInteger *verify(RexxString *, RexxString *, RexxInteger *, RexxInteger *); // in behaviour
113  RexxString *subWord(RexxInteger *, RexxInteger *); // in behaviour
114  RexxArray *subWords(RexxInteger *, RexxInteger *); // in behaviour
115  RexxString *word(RexxInteger *); // in behaviour
116  RexxInteger *wordIndex(RexxInteger *); // in behaviour
117  RexxInteger *wordLength(RexxInteger *); // in behaviour
118  RexxInteger *words(); // in behaviour
119  RexxInteger *wordPos(RexxString *, RexxInteger *); // in behaviour
120  RexxInteger *caselessWordPos(RexxString *, RexxInteger *); // in behaviour
121  RexxMutableBuffer *delWord(RexxInteger *position, RexxInteger *plength); // in behaviour
122  RexxMutableBuffer *space(RexxInteger *space_count, RexxString *pad);
123 
124  inline const char *getStringData() { return data->getData(); }
125  inline sizeB_t getBLength() { return dataBLength; }
126  inline void setBLength(sizeB_t l) { dataBLength = l; data->setDataLength(size_v(l));};
127  inline sizeB_t getBufferLength() { return bufferLength; }
129  inline char * getData() { return data->getData(); }
130  inline void copyData(sizeB_t offset, const char *string, sizeB_t l) { data->copyData(offset, string, l); }
131  inline void openGap(sizeB_t offset, sizeB_t _size, sizeB_t tailSize) { data->openGap(offset, _size, tailSize); }
132  inline void closeGap(sizeB_t offset, sizeB_t _size, sizeB_t tailSize) { data->closeGap(offset, _size, tailSize); }
133  inline void adjustGap(sizeB_t offset, sizeB_t _size, sizeB_t _newSize) { data->adjustGap(offset, _size, _newSize); }
134  inline void setData(sizeB_t offset, char character, sizeB_t l) { data->setData(offset, character, l); }
135  inline char getCharB(sizeB_t offset) { return getData()[size_v(offset)]; }
137  inline sizeB_t getCapacity() { return bufferLength; }
138  char *setCapacity(sizeB_t newLength);
139 
140 
141 
142  static void createInstance();
144 
145  protected:
146  sizeB_t bufferLength; /* buffer length in bytes */
147  sizeB_t defaultSize; /* default size when emptied */
148  sizeB_t dataBLength; // current length of data in bytes
149  RexxBuffer *data; /* buffer used for the data */
150  };
151 
152 #endif
RexxInteger * new_integer(wholenumber_t v)
RESTORETYPE
Definition: ObjectClass.hpp:80
void setDataLength(sizeB_t l)
Definition: BufferClass.hpp:55
void copyData(sizeB_t offset, const char *string, sizeB_t l)
Definition: BufferClass.hpp:57
void openGap(sizeB_t offset, sizeB_t _size, sizeB_t tailSize)
Definition: BufferClass.hpp:60
void setData(sizeB_t offset, char character, sizeB_t l)
Definition: BufferClass.hpp:83
void closeGap(sizeB_t offset, sizeB_t _size, sizeB_t tailSize)
Definition: BufferClass.hpp:64
void adjustGap(sizeB_t offset, sizeB_t _size, sizeB_t _newSize)
Definition: BufferClass.hpp:69
virtual char * getData()
RexxMutableBuffer * newRexx(RexxObject **, size_t, size_t)
RexxMutableBufferClass(RESTORETYPE restoreType)
RexxMutableBuffer * appendCstring(const char *, sizeB_t blength)
RexxInteger * caselessLastPos(RexxString *needle, RexxInteger *_start, RexxInteger *_range)
RexxMutableBuffer * caselessChangeStr(RexxString *needle, RexxString *newNeedle, RexxInteger *countArg)
RexxMutableBuffer * translate(RexxString *tableo, RexxString *tablei, RexxString *pad, RexxInteger *, RexxInteger *)
bool primitiveMatch(stringsizeB_t start, RexxString *other, stringsizeB_t offset, stringsizeB_t len)
void closeGap(sizeB_t offset, sizeB_t _size, sizeB_t tailSize)
RexxString * subchar(RexxInteger *startPosition)
char getCharB(sizeB_t offset)
RexxMutableBuffer * mydelete(RexxObject *, RexxObject *)
RexxArray * subWords(RexxInteger *, RexxInteger *)
RexxMutableBuffer * changeStr(RexxString *needle, RexxString *newNeedle, RexxInteger *countArg)
void liveGeneral(int reason)
sizeB_t setDataLength(sizeB_t l)
void adjustGap(sizeB_t offset, sizeB_t _size, sizeB_t _newSize)
void openGap(sizeB_t offset, sizeB_t _size, sizeB_t tailSize)
RexxInteger * verify(RexxString *, RexxString *, RexxInteger *, RexxInteger *)
RexxMutableBuffer * lower(RexxInteger *_start, RexxInteger *_length)
static void createInstance()
void flatten(RexxEnvelope *envelope)
const char * getStringData()
RexxMutableBuffer * append(RexxObject *)
void setBLength(sizeB_t l)
RexxInteger * posRexx(RexxString *needle, RexxInteger *_start, RexxInteger *_range)
RexxMutableBuffer(RESTORETYPE restoreType)
RexxMutableBuffer * space(RexxInteger *space_count, RexxString *pad)
RexxMutableBuffer * delWord(RexxInteger *position, RexxInteger *plength)
RexxInteger * wordPos(RexxString *, RexxInteger *)
void setData(sizeB_t offset, char character, sizeB_t l)
bool primitiveCaselessMatch(stringsizeB_t start, RexxString *other, stringsizeB_t offset, stringsizeB_t len)
RexxInteger * caselessWordPos(RexxString *, RexxInteger *)
void ensureCapacity(sizeB_t addedLength)
RexxInteger * caselessMatch(RexxInteger *start_, RexxString *other, RexxInteger *offset_, RexxInteger *len_)
RexxMutableBuffer * upper(RexxInteger *_start, RexxInteger *_length)
RexxInteger * countStrRexx(RexxString *needle)
RexxInteger * matchChar(RexxInteger *position_, RexxString *matchSet)
RexxString * makeString()
RexxObject * lengthRexx()
RexxInteger * caselessCountStrRexx(RexxString *needle)
RexxInteger * getBufferSize()
char * setCapacity(sizeB_t newLength)
void copyData(sizeB_t offset, const char *string, sizeB_t l)
RexxInteger * wordLength(RexxInteger *)
RexxInteger * wordIndex(RexxInteger *)
RexxObject * setBufferSize(RexxInteger *)
static RexxClass * classInstance
RexxInteger * lastPos(RexxString *needle, RexxInteger *_start, RexxInteger *_range)
RexxMutableBuffer * overlay(RexxObject *, RexxObject *, RexxObject *, RexxObject *)
RexxInteger * caselessMatchChar(RexxInteger *position_, RexxString *matchSet)
RexxMutableBuffer * replaceAt(RexxObject *str, RexxObject *pos, RexxObject *len, RexxObject *pad)
RexxString * subWord(RexxInteger *, RexxInteger *)
RexxString * primitiveMakeString()
RexxObject * setBufferLength(sizeB_t)
RexxInteger * match(RexxInteger *start_, RexxString *other, RexxInteger *offset_, RexxInteger *len_)
RexxInteger * caselessPos(RexxString *needle, RexxInteger *_start, RexxInteger *_range)
RexxString * word(RexxInteger *)
RexxString * substr(RexxInteger *startPosition, RexxInteger *len, RexxString *pad)
RexxMutableBuffer * insert(RexxObject *, RexxObject *, RexxObject *, RexxObject *)
RexxMessage * start(RexxObject **, size_t, size_t)
RexxObject * makeArrayRexx()
stringsize_t stringsizeB_t
Definition: rexx.h:247
#define size_v(X)
Definition: rexx.h:237
stringsizeB_t sizeB_t
Definition: rexx.h:248