source: cpp/gdk/sstringutils.cpp @ 88

Last change on this file since 88 was 81, checked in by Maciej Komosinski, 12 years ago

improved parsing of properties (e.g. in f0 genotypes)

  • Property svn:eol-style set to native
File size: 4.2 KB
Line 
1// This file is a part of the Framsticks GDK library.
2// Copyright (C) 2002-2011  Szymon Ulatowski.  See LICENSE.txt for details.
3// Refer to http://www.framsticks.com/ 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                case '\\': tmp+="\\\\"; changed=1; break;
124                default: tmp+=*x;
125                }
126        x++;
127        }
128if (changed) target=tmp;
129return changed;
130}
131
132const char* skipQuoteString(const char* txt, const char* limit)
133{
134while(*txt)
135        {
136        if (*txt=='\"') return txt;
137        if (*txt=='\\') txt++;
138        txt++;
139        if (txt==limit) break;
140        }
141return txt;
142}
143
144int sstringUnquote(SString &target)
145{
146const char* x=target;
147SString tmp;
148char *f;
149while(1)
150        {
151        f=strchr((char*)x,'\\');
152        if (f)
153                {
154                tmp.append(x,f-x);
155                switch(f[1])
156                        {
157                        case 'n': tmp+='\n'; break;
158                        case 'r': tmp+='\r'; break;
159                        case 't': tmp+='\t'; break;
160                        case '\"': tmp+='\"'; break;
161                        default: tmp+=f[1];
162                        }
163                x=f+2;
164                }
165        else
166                {
167                if (tmp.len()==0) return 0; // nothing was changed!
168                tmp+=x;
169                target=tmp;
170                return 1;
171                }
172        }
173}
174
175int strFindField(const SString& txt,const SString& name,int &end)
176{
177const char* t=txt,*n;
178int pos=0;
179while(1)
180        {
181        n=strchr(t+pos,',');
182        if ((!strncmp(t+pos,name,name.len()))&&(t[pos+name.len()]=='='))
183                {
184                if (n) end=n-t; else end=txt.len();
185                return pos;
186                }
187        if (n) pos=n-t+1; else break;
188        }
189return -1;
190}
191
192SString strGetField(const SString& txt,const SString& name)
193{
194int p,e;
195p=strFindField(txt,name,e);
196if (p<0) return SString();
197p+=name.len()+1;
198return SString(txt.substr(p,e-p));
199}
200
201void strSetField(SString& txt,const SString& name,const SString& value)
202{
203int p,e;
204p=strFindField(txt,name,e);
205if (p<0)
206        {
207        if (!value.len()) return;
208        char *t=txt.directAppend(1+name.len()+value.len());
209        char *b=t;
210        if (txt.len()) *(t++)=',';
211        strcpy(t,name); t+=name.len();
212        *(t++)+='=';
213        strcpy(t,value); t+=value.len();
214        txt.endAppend(t-b);
215        }
216else
217        {
218        if (!value.len())
219                {
220                if (p>0) p--; else if (e<txt.len()) e++;
221                char *t=txt.directWrite(0);
222                memmove(t+p,t+e,txt.len()-e);
223                txt.endWrite(txt.len()+value.len()-(e-p));
224                }
225        else
226                {
227                p+=name.len()+1;
228                char *t=txt.directWrite(txt.len()+value.len()-(e-p));
229                memmove(t+p+value.len(),t+e,txt.len()-e);
230                memmove(t+p,value,value.len());
231                txt.endWrite(txt.len()+value.len()-(e-p));
232                }
233        }
234}
235
236SString trim(SString& s)
237{
238const unsigned char*b=(const unsigned char*)(const char*)s;
239const unsigned char*e=b+s.len();
240while((b<e)&&(*b<=' ')) b++;
241while((b<e)&&(e[-1]<=' ')) e--;
242if ((e-b)==s.len()) return s;
243SString newstring;
244char* t=newstring.directWrite();
245memmove(t,b,e-b);
246newstring.endWrite(e-b);
247return newstring;
248}
Note: See TracBrowser for help on using the repository browser.