ESP3D/esp3d/storestrings.cpp
luc 713d4764fb Change name to ESP3D
Thanks to @openhardwarecoza and @TRoager  for the idea and feedback
2016-06-09 10:23:20 +02:00

140 lines
3.6 KiB
C++

/*
storestrings.cpp - rolling storage class
Copyright (c) 2014 Luc Lebosse. All rights reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "storestrings.h"
//Constructor
STORESTRINGS_CLASS::STORESTRINGS_CLASS (int maxsize , int maxstringlength)
{
//for rolling buffer
//if max size is reached then remove oldest one and add the new one
_maxsize=maxsize;
//to limit the storage space
_maxstringlength=maxstringlength;
//need space for the "..."
if (_maxstringlength<4 && _maxstringlength!=-1) {
_maxstringlength=4;
}
}
//Destructor
STORESTRINGS_CLASS::~STORESTRINGS_CLASS ()
{
// clear list and content
clear();
}
bool STORESTRINGS_CLASS::setsize(int size)
{
_maxsize=size;
return true;
}
bool STORESTRINGS_CLASS::setlength(int len)
{
if (len < 4) {
return false;
}
_maxstringlength = len;
return true;
}
//Clear list and content
void STORESTRINGS_CLASS::clear()
{
//while list is not empty
while(_charlist.size()) {
//remove element
char * str = _charlist.pop();
//destroy it
delete str;
}
}
bool STORESTRINGS_CLASS::add (const __FlashStringHelper *str)
{
String stmp;
stmp=str;
return add(stmp.c_str());
}
//Add element in storage
bool STORESTRINGS_CLASS::add (const char * string)
{
//if we reach max size
if (_maxsize==_charlist.size()) {
//remove oldest one
char * str = _charlist.shift();
delete str;
}
//add new one
//get size including \0 at the end
size_t size = strlen(string)+1;
bool need_resize=false;
if ( (_maxstringlength!=-1) && (size >_maxstringlength+1 )) {
need_resize = true;
size=_maxstringlength+1;
}
//reserve memory
char * ptr = new char[size*sizeof(char)];
//copy string to storage
if (need_resize) {
//copy maximum length minus 3
strncpy(ptr,string,_maxstringlength-3);
strcpy(ptr+_maxstringlength-3,"...");
} else {
//copy as it is
strcpy(ptr,string);
}
//add storage to list
_charlist.add(ptr);
return true;
}
//Remove element at pos position
bool STORESTRINGS_CLASS::remove(int pos)
{
//be sure index is in range
if (pos<0 && pos>(_charlist.size()-1)) {
return false;
}
//remove item from list
char * str = _charlist.remove(pos);
//destroy item
delete str;
return true;
}
//Get element at pos position
const char * STORESTRINGS_CLASS::get(int pos)
{
//be sure index is in range
if (pos<0 && pos>(_charlist.size()-1)) {
return NULL;
}
return (const char *) _charlist.get(pos);
}
//Get index for defined string
int STORESTRINGS_CLASS::get_index(const char * string)
{
//parse the list until it is found
for (int p=0; p<_charlist.size(); p++) {
if (strcmp ( _charlist.get(p), string)==0) {
return p;
}
}
//if not found return -1
return -1;
}