mirror of
https://git.mirrors.martin98.com/https://github.com/luc-github/ESP3D.git
synced 2025-06-30 20:45:16 +08:00
140 lines
3.6 KiB
C++
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;
|
|
}
|
|
|