Skip to content

Commit f7b0372

Browse files
committed
examples
1 parent d99e99a commit f7b0372

File tree

3 files changed

+57
-17
lines changed

3 files changed

+57
-17
lines changed

cstruct/__init__.py

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ def define(key: str, value: Any) -> None:
6767
"""
6868
Define a constant that can be used in the C struct
6969
70+
Examples:
71+
>>> define("INIT_THREAD_SIZE", 16384)
72+
7073
Args:
7174
key: identifier
7275
value: value of the constant
@@ -78,8 +81,15 @@ def undef(key: str) -> None:
7881
"""
7982
Undefine a symbol that was previously defined with define
8083
84+
Examples:
85+
>>> define("INIT_THREAD_SIZE", 16384)
86+
>>> undef("INIT_THREAD_SIZE")
87+
8188
Args:
8289
key: identifier
90+
91+
Raises:
92+
KeyError: If key is not defined
8393
"""
8494
del DEFINES[key]
8595

@@ -88,8 +98,15 @@ def getdef(key: str) -> Any:
8898
"""
8999
Return the value for a constant
90100
101+
Examples:
102+
>>> define("INIT_THREAD_SIZE", 16384)
103+
>>> getdef("INIT_THREAD_SIZE")
104+
91105
Args:
92106
key: identifier
107+
108+
Raises:
109+
KeyError: If key is not defined
93110
"""
94111
return DEFINES[key]
95112

@@ -98,6 +115,11 @@ def typedef(type_: str, alias: str) -> None:
98115
"""
99116
Define an alias name for a data type
100117
118+
Examples:
119+
>>> typedef("int", "status")
120+
>>> sizeof("status")
121+
4
122+
101123
Args:
102124
type_: data type
103125
alias: new alias name
@@ -120,6 +142,9 @@ def get_type(type_: str) -> Any:
120142
121143
Returns:
122144
class: data type class
145+
146+
Raises:
147+
KeyError: If type is not defined
123148
"""
124149
while type_ in TYPEDEFS:
125150
type_ = TYPEDEFS[type_]
@@ -148,6 +173,8 @@ def sizeof(type_: str) -> int:
148173
Examples:
149174
>>> sizeof("struct Position")
150175
16
176+
>>> sizeof('enum htmlfont')
177+
4
151178
>>> sizeof("int")
152179
4
153180
@@ -156,6 +183,9 @@ def sizeof(type_: str) -> int:
156183
157184
Returns:
158185
size: size in bytes
186+
187+
Raises:
188+
KeyError: If type is not defined
159189
"""
160190
while type_ in TYPEDEFS:
161191
type_ = TYPEDEFS[type_]
@@ -169,7 +199,11 @@ def parse(
169199
"""
170200
Return a new class mapping a C struct/union/enum definition.
171201
If the string does not contains any definition, return None.
202+
If the string contains multiple struct/union/enum definitions, returns the last definition.
172203
204+
Examples:
205+
>>> cstruct.parse('struct Pair { unsigned char a; unsigned char b; };')
206+
<class 'abc.Pair'>
173207
174208
Args:
175209
__struct__ (str): definition of the struct (or union/enum) in C syntax
@@ -178,11 +212,14 @@ def parse(
178212
179213
Returns:
180214
cls: __cls__ subclass
215+
216+
Raises:
217+
cstruct.exceptions.ParserError: Parsing exception
218+
181219
"""
182220
if __cls__ is None:
183221
__cls__ = MemCStruct
184222
cls_def = parse_struct_def(__struct__, __cls__=__cls__, process_muliple_definition=True, **kargs)
185-
print('!!!!!', cls_def, kargs)
186223
if cls_def is None:
187224
return None
188225
return cls_def['__cls__'].parse(cls_def, **kargs)

cstruct/c_parser.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def __init__(self, text: str) -> None:
5151
_, name, value = line.strip().split(maxsplit=2)
5252
DEFINES[name] = c_eval(value)
5353
except Exception:
54-
raise ParserError(f"Parsing line {line}")
54+
raise ParserError(f"Parsing line `{line}`")
5555
else:
5656
lines.append(line)
5757
text = "\n".join(lines)
@@ -124,7 +124,7 @@ def parse_type(tokens: Tokens, __cls__: Type['AbstractCStruct'], byte_order: Opt
124124
if "[" in next_token:
125125
t = next_token.split("[")
126126
if len(t) != 2:
127-
raise ParserError("Error parsing: " + next_token)
127+
raise ParserError(f"Error parsing: `{next_token}`")
128128
next_token = t[0].strip()
129129
vlen_part = t[1]
130130
vlen_expr = []
@@ -163,7 +163,7 @@ def parse_type(tokens: Tokens, __cls__: Type['AbstractCStruct'], byte_order: Opt
163163
try:
164164
ref = STRUCTS[tail]
165165
except KeyError:
166-
raise ParserError(f"Unknown '{c_type}' '{tail}'")
166+
raise ParserError(f"Unknown `{c_type} {tail}`")
167167
elif c_type.startswith('enum'):
168168
from .cenum import CEnum
169169

@@ -181,7 +181,7 @@ def parse_type(tokens: Tokens, __cls__: Type['AbstractCStruct'], byte_order: Opt
181181
try:
182182
ref = ENUMS[tail]
183183
except KeyError:
184-
raise ParserError(f"Unknown '{c_type}' '{tail}'")
184+
raise ParserError(f"Unknown `{c_type} {tail}`")
185185
else: # other types
186186
kind = Kind.NATIVE
187187
ref = None
@@ -201,7 +201,7 @@ def parse_typedef(tokens: Tokens, __cls__: Type['AbstractCStruct'], byte_order:
201201
TYPEDEFS[vname] = f"struct {field_type.ref.__name__}"
202202
t = tokens.pop()
203203
if t != ';':
204-
raise ParserError(f"; expected but {t} found")
204+
raise ParserError(f"`;` expected but `{t}` found")
205205

206206

207207
def parse_struct_def(
@@ -242,7 +242,7 @@ def parse_struct_def(
242242
elif name == '{': # unnamed enum
243243
result = parse_enum(tokens, native_format=native_format)
244244
else:
245-
raise ParserError(f"{name} definition expected")
245+
raise ParserError(f"`{name}` definition expected")
246246

247247
elif kind in ['struct', 'union']:
248248
if result:
@@ -257,10 +257,10 @@ def parse_struct_def(
257257
tokens, __cls__=__cls__, __is_union__=__is_union__, __byte_order__=__byte_order__, __name__=name
258258
)
259259
else:
260-
raise ParserError(f"{name} definition expected")
260+
raise ParserError(f"`{name}` definition expected")
261261

262262
else:
263-
raise ParserError(f"struct, union, or enum expected - {kind}")
263+
raise ParserError(f"struct, union, or enum expected - `{kind}` found")
264264
return result
265265

266266

@@ -274,7 +274,7 @@ def parse_enum_def(__def__: Union[str, Tokens], **kargs: Any) -> Optional[Dict[s
274274
return None
275275
kind = tokens.pop()
276276
if kind not in ['enum']:
277-
raise ParserError(f"enum expected - {kind}")
277+
raise ParserError(f"enum expected - `{kind}` found")
278278

279279
name = tokens.pop()
280280
native_format = None
@@ -288,7 +288,7 @@ def parse_enum_def(__def__: Union[str, Tokens], **kargs: Any) -> Optional[Dict[s
288288
elif name == '{': # unnamed enum
289289
return parse_enum(tokens)
290290
else:
291-
raise ParserError(f"{name} definition expected")
291+
raise ParserError(f"`{name}` definition expected")
292292

293293

294294
def parse_enum(
@@ -348,10 +348,10 @@ def parse_enum(
348348
except (ValueError, TypeError):
349349
value = int(int_expr)
350350
else:
351-
raise ParserError(f"{__enum__} is not a valid enum expression")
351+
raise ParserError(f"`{__enum__}` is not a valid enum expression")
352352

353353
if name in constants:
354-
raise ParserError(f"duplicate enum name {name}")
354+
raise ParserError(f"duplicate enum name `{name}`")
355355
constants[name] = value
356356

357357
if next_token == "}":
@@ -416,15 +416,15 @@ def parse_struct(
416416
field_type = parse_type(tokens, __cls__, __byte_order__, offset)
417417
vname = tokens.pop()
418418
if vname in fields_types:
419-
raise ParserError(f"Duplicate member '{vname}'")
419+
raise ParserError(f"Duplicate member `{vname}`")
420420
if vname in dir(__cls__):
421-
raise ParserError(f"Invalid reserved member name '{vname}'")
421+
raise ParserError(f"Invalid reserved member name `{vname}`")
422422
# anonymous nested union
423423
if vname == ';' and field_type.ref is not None and (__is_union__ or field_type.ref.__is_union__):
424424
# add the anonymous struct fields to the parent
425425
for nested_field_name, nested_field_type in field_type.ref.__fields_types__.items():
426426
if nested_field_name in fields_types:
427-
raise ParserError(f"Duplicate member '{nested_field_name}'")
427+
raise ParserError(f"Duplicate member `{nested_field_name}`")
428428
fields_types[nested_field_name] = nested_field_type
429429
vname = f"__anonymous{anonymous}"
430430
anonymous += 1
@@ -438,7 +438,7 @@ def parse_struct(
438438
offset = field_type.offset + field_type.vsize
439439
t = tokens.pop()
440440
if t != ';':
441-
raise ParserError(f"; expected but {t} found")
441+
raise ParserError(f"`;` expected but `{t}` found")
442442

443443
if __is_union__: # C union
444444
# Calculate the sizeof union as size of its largest element

cstruct/native_types.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ def get_native_type(type_: str) -> "AbstractNativeType":
6666
6767
Returns:
6868
class: data type class
69+
70+
Raises:
71+
KeyError: If type is not defined
6972
"""
7073
try:
7174
return NATIVE_TYPES[type_]

0 commit comments

Comments
 (0)