Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
M
micropython
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container registry
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
This is an archived project. Repository and other project resources are read-only.
Show more breadcrumbs
card10
micropython
Commits
68f59a96
Commit
68f59a96
authored
11 years ago
by
Damien
Browse files
Options
Downloads
Patches
Plain Diff
Add vstr and its functions.
parent
df4b4f31
No related branches found
No related tags found
No related merge requests found
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
py/misc.h
+14
-8
14 additions, 8 deletions
py/misc.h
py/vstr.c
+206
-0
206 additions, 0 deletions
py/vstr.c
with
220 additions
and
8 deletions
py/misc.h
+
14
−
8
View file @
68f59a96
...
...
@@ -58,9 +58,15 @@ void encode_le32(byte *buf, unsigned int i);
/** variable string *********************************************/
/*
typedef struct _vstr_t vstr_t;
typedef
struct
_vstr_t
{
int
alloc
;
int
len
;
char
*
buf
;
bool
had_error
;
}
vstr_t
;
void
vstr_init
(
vstr_t
*
vstr
);
void
vstr_clear
(
vstr_t
*
vstr
);
vstr_t
*
vstr_new
();
void
vstr_free
(
vstr_t
*
vstr
);
void
vstr_reset
(
vstr_t
*
vstr
);
...
...
@@ -69,14 +75,14 @@ char *vstr_str(vstr_t *vstr);
int
vstr_len
(
vstr_t
*
vstr
);
void
vstr_hint_size
(
vstr_t
*
vstr
,
int
size
);
char
*
vstr_add_len
(
vstr_t
*
vstr
,
int
len
);
void
vstr_add_byte
(
vstr_t
*
vstr
,
byte
v
);
void
vstr_add_char
(
vstr_t
*
vstr
,
unichar
chr
);
void
vstr_add_str
(
vstr_t
*
vstr
,
const
char
*
str
);
void
vstr_add_strn
(
vstr_t
*
vstr
,
const
char
*
str
,
int
len
);
void vstr_add_byte(vstr_t *vstr, byte v);
void vstr_add_le16(vstr_t *vstr, unsigned short v);
void vstr_add_le32(vstr_t *vstr, unsigned int v);
//void vstr_add_le16(vstr_t *vstr, unsigned short v);
//void vstr_add_le32(vstr_t *vstr, unsigned int v);
void
vstr_cut_tail
(
vstr_t
*
vstr
,
int
len
);
void vstr_printf(vstr_t *vstr, const char *fmt, ...);
*/
//void vstr_printf(vstr_t *vstr, const char *fmt, ...);
/** unique string ***********************************************/
...
...
This diff is collapsed.
Click to expand it.
py/vstr.c
0 → 100644
+
206
−
0
View file @
68f59a96
#include
<stdio.h>
#include
<stdarg.h>
#include
<string.h>
#include
"misc.h"
// returned value is always at least 1 greater than argument
#define ROUND_ALLOC(a) (((a) & ((~0) - 7)) + 8)
void
vstr_init
(
vstr_t
*
vstr
)
{
vstr
->
alloc
=
32
;
vstr
->
len
=
0
;
vstr
->
buf
=
m_new
(
char
,
vstr
->
alloc
);
if
(
vstr
->
buf
==
NULL
)
{
m_free
(
vstr
);
vstr
->
had_error
=
true
;
return
;
}
vstr
->
buf
[
0
]
=
0
;
vstr
->
had_error
=
false
;
}
void
vstr_clear
(
vstr_t
*
vstr
)
{
m_free
(
vstr
->
buf
);
vstr
->
buf
=
NULL
;
}
vstr_t
*
vstr_new
()
{
vstr_t
*
vstr
=
m_new
(
vstr_t
,
1
);
if
(
vstr
==
NULL
)
{
return
NULL
;
}
vstr_init
(
vstr
);
return
vstr
;
}
void
vstr_free
(
vstr_t
*
vstr
)
{
if
(
vstr
!=
NULL
)
{
m_free
(
vstr
->
buf
);
m_free
(
vstr
);
}
}
void
vstr_reset
(
vstr_t
*
vstr
)
{
vstr
->
len
=
0
;
vstr
->
buf
[
0
]
=
0
;
vstr
->
had_error
=
false
;
}
bool
vstr_had_error
(
vstr_t
*
vstr
)
{
return
vstr
->
had_error
;
}
char
*
vstr_str
(
vstr_t
*
vstr
)
{
if
(
vstr
->
had_error
)
{
return
NULL
;
}
return
vstr
->
buf
;
}
int
vstr_len
(
vstr_t
*
vstr
)
{
if
(
vstr
->
had_error
)
{
return
0
;
}
return
vstr
->
len
;
}
bool
vstr_ensure_extra
(
vstr_t
*
vstr
,
int
size
)
{
if
(
vstr
->
len
+
size
+
1
>
vstr
->
alloc
)
{
int
new_alloc
=
ROUND_ALLOC
((
vstr
->
len
+
size
+
1
)
*
2
);
char
*
new_buf
=
m_renew
(
char
,
vstr
->
buf
,
new_alloc
);
if
(
new_buf
==
NULL
)
{
vstr
->
had_error
=
true
;
return
false
;
}
vstr
->
alloc
=
new_alloc
;
vstr
->
buf
=
new_buf
;
}
return
true
;
}
void
vstr_hint_size
(
vstr_t
*
vstr
,
int
size
)
{
// it's not an error if we fail to allocate for the size hint
bool
er
=
vstr
->
had_error
;
vstr_ensure_extra
(
vstr
,
size
);
vstr
->
had_error
=
er
;
}
char
*
vstr_add_len
(
vstr_t
*
vstr
,
int
len
)
{
if
(
vstr
->
had_error
||
!
vstr_ensure_extra
(
vstr
,
len
))
{
return
NULL
;
}
char
*
buf
=
vstr
->
buf
+
vstr
->
len
;
vstr
->
len
+=
len
;
vstr
->
buf
[
vstr
->
len
]
=
0
;
return
buf
;
}
void
vstr_add_byte
(
vstr_t
*
vstr
,
byte
v
)
{
byte
*
buf
=
(
byte
*
)
vstr_add_len
(
vstr
,
1
);
if
(
buf
==
NULL
)
{
return
;
}
buf
[
0
]
=
v
;
}
void
vstr_add_char
(
vstr_t
*
vstr
,
unichar
c
)
{
// TODO UNICODE
byte
*
buf
=
(
byte
*
)
vstr_add_len
(
vstr
,
1
);
if
(
buf
==
NULL
)
{
return
;
}
buf
[
0
]
=
c
;
}
void
vstr_add_str
(
vstr_t
*
vstr
,
const
char
*
str
)
{
vstr_add_strn
(
vstr
,
str
,
strlen
(
str
));
}
void
vstr_add_strn
(
vstr_t
*
vstr
,
const
char
*
str
,
int
len
)
{
if
(
vstr
->
had_error
||
!
vstr_ensure_extra
(
vstr
,
len
))
{
return
;
}
memmove
(
vstr
->
buf
+
vstr
->
len
,
str
,
len
);
vstr
->
len
+=
len
;
vstr
->
buf
[
vstr
->
len
]
=
0
;
}
/*
void vstr_add_le16(vstr_t *vstr, unsigned short v) {
byte *buf = (byte*)vstr_add_len(vstr, 2);
if (buf == NULL) {
return;
}
encode_le16(buf, v);
}
void vstr_add_le32(vstr_t *vstr, unsigned int v) {
byte *buf = (byte*)vstr_add_len(vstr, 4);
if (buf == NULL) {
return;
}
encode_le32(buf, v);
}
*/
void
vstr_cut_tail
(
vstr_t
*
vstr
,
int
len
)
{
if
(
vstr
->
had_error
)
{
return
;
}
if
(
len
>
vstr
->
len
)
{
vstr
->
len
=
0
;
}
else
{
vstr
->
len
-=
len
;
}
}
/*
void vstr_printf(vstr_t *vstr, const char *fmt, ...) {
if (vstr->had_error || !vstr_ensure_extra(vstr, strlen(fmt))) {
return;
}
while (1) {
// try to print in the allocated space
int size = vstr->alloc - vstr->len;
va_list ap;
va_start(ap, fmt);
int n = vsnprintf(vstr->buf + vstr->len, size, fmt, ap);
va_end(ap);
// if that worked, return
if (n > -1 && n < size) {
vstr->len += n;
return;
}
// else try again with more space
if (n > -1) { // glibc 2.1
// n + 1 is precisely what is needed
if (!vstr_ensure_extra(vstr, n + 1)) {
return;
}
} else { // glibc 2.0
// increase to twice the old size
if (!vstr_ensure_extra(vstr, size * 2)) {
return;
}
}
}
}
*/
/** testing *****************************************************/
/*
int main() {
vstr_t *vstr = vstr_new();
int i;
for (i = 0; i < 10; i++) {
vstr_printf(vstr, "%d) this is a test %d %s\n", i, 1234, "'a string'");
vstr_add_str(vstr, "-----");
vstr_printf(vstr, "this is another test %d %s\n", 1234, "'a second string'");
printf("%s", vstr->buf);
}
}
*/
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment