source: cpp/gdk/sstringutils.cpp @ 5

Last change on this file since 5 was 5, checked in by sz, 15 years ago

added the GDK (Genotype Development Kit)

File size: 3.8 KB
Line 
1// This file is a part of Framsticks GDK library.
2// Copyright (C) 2002-2006  Szymon Ulatowski.  See LICENSE.txt for details.
3// Refer to http://www.frams.alife.pl/ for further information.
4
5#include "sstringutils.h"
6#include "virtfile.h"
7#include "framsg.h"
8
9int loadSString(const char* filename,SString& s,const char* framsgmodule,const char* error)
10{
11VirtFILE *f;
12int ret=0;
13if (f=Vfopen(filename,"rb"))
14        {
15        loadSString(f,s);
16        ret=1;
17        fclose(f);
18        }
19else if (framsgmodule)
20        FMprintf(framsgmodule,"loadSString",FMLV_WARN,error?error:"can't open file \"%s\"",filename);
21return ret;
22}
23
24void loadSString(VirtFILE *f,SString& s)
25{
26static char buf[4000];
27int len;
28while(!f->Veof())
29        {
30        len=fread(buf,1,4000,f);
31        s.append(buf,len);
32        }
33}
34
35//////////////////////////
36
37/** "x~xx~xxx" -> "x\~xx\~xxx"  */
38int quoteTilde(SString &target)
39{
40const char* x=target;
41SString tmp;
42char *f;
43while(1)
44        {
45        f=strchr((char*)x,'~');
46        if (f)
47                {
48                tmp.append(x,f-x);
49                tmp+="\\~";
50                x=f+1;
51                }
52        else
53                {
54                if (tmp.len()==0) return 0; // nothing was changed!
55                tmp+=x;
56                target=tmp;
57                return 1;
58                }
59        }
60}
61
62/** "x\~xx\~xxx" -> "x~xx~xxx"  */
63int unquoteTilde(SString &target)
64{
65const char* x=target;
66SString tmp;
67char *f;
68while(1)
69        {
70        f=strchr((char*)x,'\\');
71        if (f)
72                {
73                tmp.append(x,f-x);
74                if (f[1]=='~')
75                        {
76                        tmp+='~';
77                        x=f+2;
78                        }
79                else
80                        {
81                        tmp+="\\";
82                        x=f+1;
83                        }
84                }
85        else
86                {
87                if (tmp.len()==0) return 0; // nothing was changed!
88                tmp+=x;
89                target=tmp;
90                return 1;
91                }
92        }
93}
94
95/////////////////
96
97bool strContainsOneOf(const char* str,const char* chars)
98{
99while(*str)
100        {
101        if (strchr(chars,*str)) return 1;
102        str++;
103        }
104return 0;
105}
106
107//////////////
108
109bool sstringQuote(SString& target)
110{
111const char* x=target;
112bool changed=0;
113SString tmp;
114tmp.memoryHint(target.len());
115while(*x)
116        {
117        switch(*x)
118                {
119                case '\n': tmp+="\\n"; changed=1; break;
120                case '\r': tmp+="\\r"; changed=1; break;
121                case '\t': tmp+="\\t"; changed=1; break;
122                case '\"': tmp+="\\\""; changed=1; break;
123                default: tmp+=*x;
124                }
125        x++;
126        }
127if (changed) target=tmp;
128return changed;
129}
130
131const char* skipQuoteString(const char* txt, const char* limit)
132{
133while(*txt)
134        {
135        if (*txt=='\"') return txt;
136        if (*txt=='\\') txt++;
137        txt++;
138        if (txt==limit) break;
139        }
140return txt;
141}
142
143int sstringUnquote(SString &target)
144{
145const char* x=target;
146SString tmp;
147char *f;
148while(1)
149        {
150        f=strchr((char*)x,'\\');
151        if (f)
152                {
153                tmp.append(x,f-x);
154                switch(f[1])
155                        {
156                        case 'n': tmp+='\n'; break;
157                        case 'r': tmp+='\r'; break;
158                        case 't': tmp+='\t'; break;
159                        case '\"': tmp+='\"'; break;
160                        default: tmp+=f[1];
161                        }
162                x=f+2;
163                }
164        else
165                {
166                if (tmp.len()==0) return 0; // nothing was changed!
167                tmp+=x;
168                target=tmp;
169                return 1;
170                }
171        }
172}
173
174int strFindField(const SString& txt,const SString& name,int &end)
175{
176const char* t=txt,*n;
177int pos=0;
178while(1)
179        {
180        n=strchr(t+pos,',');
181        if ((!strncmp(t+pos,name,name.len()))&&(t[pos+name.len()]=='='))
182                {
183                if (n) end=n-t; else end=txt.len();
184                return pos;
185                }
186        if (n) pos=n-t+1; else break;
187        }
188return -1;
189}
190
191SString strGetField(const SString& txt,const SString& name)
192{
193int p,e;
194p=strFindField(txt,name,e);
195if (p<0) return SString();
196p+=name.len()+1;
197return SString(txt.substr(p,e-p));
198}
199
200void strSetField(SString& txt,const SString& name,const SString& value)
201{
202int p,e;
203p=strFindField(txt,name,e);
204if (p<0)
205        {
206        if (!value.len()) return;
207        char *t=txt.directAppend(1+name.len()+value.len());
208        char *b=t;
209        if (txt.len()) *(t++)=',';
210        strcpy(t,name); t+=name.len();
211        *(t++)+='=';
212        strcpy(t,value); t+=value.len();
213        txt.endAppend(t-b);
214        }
215else
216        {
217        if (!value.len())
218                {
219                if (p>0) p--; else if (e<txt.len()) e++;
220                char *t=txt.directWrite(0);
221                memmove(t+p,t+e,txt.len()-e);
222                txt.endWrite(txt.len()+value.len()-(e-p));
223                }
224        else
225                {
226                p+=name.len()+1;
227                char *t=txt.directWrite(txt.len()+value.len()-(e-p));
228                memmove(t+p+value.len(),t+e,txt.len()-e);
229                memmove(t+p,value,value.len());
230                txt.endWrite(txt.len()+value.len()-(e-p));
231                }
232        }
233}
234
Note: See TracBrowser for help on using the repository browser.