Skip to content

Commit 81a5f0b

Browse files
committed
!40 support configparser_read_string
* configparser read_string is ok * support replace() and strip() for StdData.String() * add file and test of configparser
1 parent 631256b commit 81a5f0b

20 files changed

Lines changed: 309 additions & 26 deletions

package/PikaStdLib/PikaStdData.pyi

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ class String(TinyObj):
7373
def isalpha(self) -> int: ...
7474
def isspace(self) -> int: ...
7575
def split(self, s: str) -> List: ...
76+
def replace(self, old: str, new: str) -> str: ...
77+
def strip(self) -> str: ...
7678

7779

7880
class ByteArray(List):

package/PikaStdLib/PikaStdData_String.c

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ PikaObj* PikaStdData_String_split(PikaObj* self, char* s) {
154154
PikaStdData_List___init__(list);
155155

156156
Args buffs = {0};
157-
char* str = obj_getStr(self, "str");
157+
char* str = strsCopy(&buffs, obj_getStr(self, "str"));
158158

159159
char sign = s[0];
160160
int token_num = strCountSign(str, sign) + 1;
@@ -173,7 +173,40 @@ PikaObj* PikaStdData_String_split(PikaObj* self, char* s) {
173173
return list;
174174
}
175175

176-
int PikaStdData_String___len__(PikaObj *self){
176+
int PikaStdData_String___len__(PikaObj* self) {
177177
char* str = obj_getStr(self, "str");
178178
return strGetSize(str);
179179
}
180+
181+
char* PikaStdData_String_strip(PikaObj* self) {
182+
Args buffs = {0};
183+
char* str = strsCopy(&buffs, obj_getStr(self, "str"));
184+
/* strip */
185+
char* str_start = str;
186+
for (size_t i = 0; i < strGetSize(str); i++) {
187+
if (str[i] != ' ') {
188+
str_start = (char*)(str + i);
189+
break;
190+
}
191+
}
192+
193+
for (int i = strGetSize(str) - 1; i >= 0; i--) {
194+
if (str[i] != ' ') {
195+
str[i + 1] = '\0';
196+
break;
197+
}
198+
}
199+
200+
obj_setStr(self, "_buf", str_start);
201+
strsDeinit(&buffs);
202+
return obj_getStr(self, "_buf");
203+
}
204+
205+
char* PikaStdData_String_replace(PikaObj* self, char* new, char* old) {
206+
Args buffs = {0};
207+
char* str = strsCopy(&buffs, obj_getStr(self, "str"));
208+
str = strsReplace(&buffs, str, old, new);
209+
obj_setStr(self, "_buf", str);
210+
strsDeinit(&buffs);
211+
return obj_getStr(self, "_buf");
212+
}

port/linux/.vscode/launch.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"program": "${workspaceFolder}/build/test/pikascript_test",
1212
// "program": "${workspaceFolder}/build/boot/demo06-pikamain/pikascript_demo06-pikamain",
1313
"args": [
14-
// "--gtest_filter=parser.common_issue1"
14+
// "--gtest_filter=parser.configparser"
1515
],
1616
"stopAtEntry": false,
1717
"cwd": "${workspaceFolder}",

port/linux/package/pikascript/PikaStdData.pyi

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ class String(TinyObj):
7373
def isalpha(self) -> int: ...
7474
def isspace(self) -> int: ...
7575
def split(self, s: str) -> List: ...
76+
def replace(self, old: str, new: str) -> str: ...
77+
def strip(self) -> str: ...
7678

7779

7880
class ByteArray(List):
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
from PikaStdData import String
2+
from PikaStdLib import MemChecker
3+
4+
5+
class ConfigParser():
6+
content = String('')
7+
config_dict = {}
8+
9+
def read(self, file_name):
10+
pass
11+
12+
def read_string(self, content):
13+
self.content = String(content)
14+
self.__parse()
15+
16+
def __parse(self):
17+
content = self.content
18+
lines = content.split('\n')
19+
for line in lines:
20+
line = String(line)
21+
if line.startwith('#'):
22+
continue
23+
if line.startwith('['):
24+
section = String(line.replace('[', ''))
25+
section = section.replace(']', '')
26+
self.config_dict[section] = {}
27+
continue
28+
29+
if line.strip() == '':
30+
continue
31+
32+
stmt = line.split('=')
33+
key = String(stmt[0])
34+
value = String(stmt[1])
35+
key = key.strip()
36+
value = value.strip()
37+
section_dict = self.config_dict[section]
38+
section_dict[key] = value
39+
print(self.config_dict)
40+
mem = MemChecker()
41+
mem.now()
42+
43+
def sections(self):
44+
pass
45+
46+
def options(self):
47+
str = String(self.content)
48+
print(str.split('\n'))
49+
50+
def get(self, section, option):
51+
pass
52+
53+
def set(self, section, option, value):
54+
pass
55+
56+
def items(self):
57+
pass
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import configparser
2+
config = configparser.ConfigParser()
3+
config.read_string('\
4+
[DEFAULT]\n\
5+
ServerAliveInterval = 45\n\
6+
Compression = yes\n\
7+
CompressionLevel = 9\n\
8+
ForwardX11 = yes\n\
9+
\n\
10+
[bitbucket.org]\n\
11+
User = hg\n\
12+
\n\
13+
[topsecret.server.com]\n\
14+
Port = 50022\n\
15+
ForwardX11 = no')

port/linux/package/pikascript/main.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import test_module4
1515
import pika_lua
1616
import import_test
17+
import configparser
1718
from PikaStdData import String as S
1819

1920
mem = PikaStdLib.MemChecker()

port/linux/package/pikascript/pikascript-lib/PikaStdLib/PikaStdData_String.c

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ PikaObj* PikaStdData_String_split(PikaObj* self, char* s) {
154154
PikaStdData_List___init__(list);
155155

156156
Args buffs = {0};
157-
char* str = obj_getStr(self, "str");
157+
char* str = strsCopy(&buffs, obj_getStr(self, "str"));
158158

159159
char sign = s[0];
160160
int token_num = strCountSign(str, sign) + 1;
@@ -173,7 +173,40 @@ PikaObj* PikaStdData_String_split(PikaObj* self, char* s) {
173173
return list;
174174
}
175175

176-
int PikaStdData_String___len__(PikaObj *self){
176+
int PikaStdData_String___len__(PikaObj* self) {
177177
char* str = obj_getStr(self, "str");
178178
return strGetSize(str);
179179
}
180+
181+
char* PikaStdData_String_strip(PikaObj* self) {
182+
Args buffs = {0};
183+
char* str = strsCopy(&buffs, obj_getStr(self, "str"));
184+
/* strip */
185+
char* str_start = str;
186+
for (size_t i = 0; i < strGetSize(str); i++) {
187+
if (str[i] != ' ') {
188+
str_start = (char*)(str + i);
189+
break;
190+
}
191+
}
192+
193+
for (int i = strGetSize(str) - 1; i >= 0; i--) {
194+
if (str[i] != ' ') {
195+
str[i + 1] = '\0';
196+
break;
197+
}
198+
}
199+
200+
obj_setStr(self, "_buf", str_start);
201+
strsDeinit(&buffs);
202+
return obj_getStr(self, "_buf");
203+
}
204+
205+
char* PikaStdData_String_replace(PikaObj* self, char* new, char* old) {
206+
Args buffs = {0};
207+
char* str = strsCopy(&buffs, obj_getStr(self, "str"));
208+
str = strsReplace(&buffs, str, old, new);
209+
obj_setStr(self, "_buf", str);
210+
strsDeinit(&buffs);
211+
return obj_getStr(self, "_buf");
212+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#include "test_common.h"
2+
3+
#if PIKA_SYNTEX_ITEM_SLICE_ENABLE
4+
TEST(configparser, test1) {
5+
char* s =
6+
"[DEFAULT]\n"
7+
"ServerAliveInterval = 45\n"
8+
"Compression = yes\n"
9+
"CompressionLevel = 9\n"
10+
"ForwardX11 = yes\n"
11+
"\n"
12+
"[bitbucket.org]\n"
13+
"User = hg\n"
14+
"\n"
15+
"[topsecret.server.com]\n"
16+
"Port = 50022\n"
17+
"ForwardX11 = no\n";
18+
19+
/* init */
20+
pikaMemInfo.heapUsedMax = 0;
21+
PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
22+
extern unsigned char pikaModules_py_a[];
23+
obj_linkLibrary(pikaMain, pikaModules_py_a);
24+
/* run */
25+
obj_setStr(pikaMain, "s", s);
26+
obj_run(pikaMain,
27+
"import configparser\n"
28+
"config = configparser.ConfigParser()\n"
29+
"config.read_string(s)\n");
30+
/* collect */
31+
/* assert */
32+
/* deinit */
33+
obj_deinit(pikaMain);
34+
EXPECT_EQ(pikaMemNow(), 0);
35+
}
36+
#endif

port/linux/test/parse-test.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3356,3 +3356,10 @@ TEST(parser, def_issue1) {
33563356
args_deinit(buffs);
33573357
EXPECT_EQ(pikaMemNow(), 0);
33583358
}
3359+
3360+
TEST(parser, configparser){
3361+
Args buffs = {0};
3362+
char* res = Parser_fileToAsm(&buffs, "package/pikascript/configparser.py");
3363+
__platform_printf("%s", res);
3364+
strsDeinit(&buffs);
3365+
}

0 commit comments

Comments
 (0)