// +-------------------------------------------------------------------------+ // | Script Plus Plus vers. 0.3.72 | // | Copyright (c) Andrey V. Stolyarov 2003--2023 | // | ----------------------------------------------------------------------- | // | This is free software. Permission is granted to everyone to use, copy | // | or modify this software under the terms and conditions of | // | GNU LESSER GENERAL PUBLIC LICENSE, v. 2.1 | // | as published by Free Software Foundation (see the file LGPL.txt) | // | | // | Please visit http://www.croco.net/software/scriptpp to get a fresh copy | // | ----------------------------------------------------------------------- | // | This code is provided strictly and exclusively on the "AS IS" basis. | // | !!! THERE IS NO WARRANTY OF ANY KIND, NEITHER EXPRESSED NOR IMPLIED !!! | // +-------------------------------------------------------------------------+ #include // for strlen() #include // for free() #include "scrvar.hpp" #include "scrvect.hpp" enum { scriptvector_default_size = 16 }; ScriptVector::ScriptVector() : vec(0), len(0), maxlen(0) { } ScriptVector::ScriptVector(const ScriptVariable &sv, const char *delims, const char *trimspaces) { vec = new ScriptVariable[scriptvector_default_size]; len = 0; maxlen = scriptvector_default_size; if(!delims) { vec[0] = sv; len = 0; return; } ScriptVariable sv1(sv); // to avoid const problem ScriptVariable::Substring iter(sv1); ScriptVariable::Substring word; while(trimspaces ? iter.FetchToken(word, delims, trimspaces) : iter.FetchWord(word, delims)) { AddItem(word.Get()); } } ScriptVector::ScriptVector(const char * const *v) { vec = new ScriptVariable[scriptvector_default_size]; len = 0; maxlen = scriptvector_default_size; while(*v) { AddItem(*v); v++; } } ScriptVector::ScriptVector(const ScriptVector &other, int aidx, int alen) { if(aidx < 0) aidx = 0; else if(aidx > other.len) aidx = other.len; if(alen == -1 || alen > other.len - aidx) alen = other.len - aidx; len = alen; maxlen = scriptvector_default_size; while(maxlen=maxlen) ProvideVectorLength(i+1); if(i>=len) len = i+1; return vec[i]; } const ScriptVector& ScriptVector::operator=(const ScriptVector &other) { ProvideVectorLength(other.len); if(len < other.len) len = other.len; while(len>other.len) { vec[len-1] = ""; len--; } for(int i = 0; i=0 && i=len) return; if(idx+amount>len) amount = len-idx; int i; for(i=idx; i= len) last = len-1; if(start > last) return ""; totallen = 0; for(i=start; i<=last; i++) totallen += vec[i].length(); if(sep) totallen += seplen * (last-start); ScriptVariableInv res; res.MakeRoom(totallen); int idx = 0; for(i=start; i<=last; i++) { for(k = 0; vec[i][k]; k++) { res[idx++] = vec[i][k]; } if(sep && i=idx+n; i--) vec[i] = vec[i-n]; for(i=0; i