Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
TASTE
uPython-mirror
Commits
be842973
Commit
be842973
authored
Jan 09, 2014
by
Damien George
Browse files
Merge pull request #123 from xbe/master
Implement str.strip
parents
f09e9031
7b0f39f3
Changes
2
Hide whitespace changes
Inline
Side-by-side
py/mpqstrraw.h
View file @
be842973
...
...
@@ -65,4 +65,5 @@ Q(append)
Q
(
pop
)
Q
(
sort
)
Q
(
join
)
Q
(
strip
)
Q
(
format
)
py/objstr.c
View file @
be842973
...
...
@@ -147,6 +147,64 @@ bad_arg:
nlr_jump
(
mp_obj_new_exception_msg
(
MP_QSTR_TypeError
,
"?str.join expecting a list of str's"
));
}
static
bool
chr_in_str
(
const
char
*
const
str
,
const
size_t
str_len
,
const
char
c
)
{
for
(
size_t
i
=
0
;
i
<
str_len
;
i
++
)
{
if
(
str
[
i
]
==
c
)
{
return
true
;
}
}
return
false
;
}
mp_obj_t
str_strip
(
int
n_args
,
const
mp_obj_t
*
args
)
{
assert
(
1
<=
n_args
&&
n_args
<=
2
);
assert
(
MP_OBJ_IS_TYPE
(
args
[
0
],
&
str_type
));
const
char
*
chars_to_del
;
static
const
char
whitespace
[]
=
"
\t\n\r\v\f
"
;
if
(
n_args
==
1
)
{
chars_to_del
=
whitespace
;
}
else
{
assert
(
MP_OBJ_IS_TYPE
(
args
[
1
],
&
str_type
));
mp_obj_str_t
*
chars_to_del_obj
=
args
[
1
];
chars_to_del
=
qstr_str
(
chars_to_del_obj
->
qstr
);
}
const
size_t
chars_to_del_len
=
strlen
(
chars_to_del
);
mp_obj_str_t
*
self
=
args
[
0
];
const
char
*
orig_str
=
qstr_str
(
self
->
qstr
);
const
size_t
orig_str_len
=
strlen
(
orig_str
);
size_t
first_good_char_pos
=
0
;
bool
first_good_char_pos_set
=
false
;
size_t
last_good_char_pos
=
0
;
for
(
size_t
i
=
0
;
i
<
orig_str_len
;
i
++
)
{
if
(
!
chr_in_str
(
chars_to_del
,
chars_to_del_len
,
orig_str
[
i
]))
{
last_good_char_pos
=
i
;
if
(
!
first_good_char_pos_set
)
{
first_good_char_pos
=
i
;
first_good_char_pos_set
=
true
;
}
}
}
if
(
first_good_char_pos
==
0
&&
last_good_char_pos
==
0
)
{
//string is all whitespace, return '\0'
char
*
empty
=
m_new
(
char
,
1
);
empty
[
0
]
=
'\0'
;
return
mp_obj_new_str
(
qstr_from_str_take
(
empty
,
1
));
}
assert
(
last_good_char_pos
>=
first_good_char_pos
);
//+1 to accomodate the last character
size_t
stripped_len
=
last_good_char_pos
-
first_good_char_pos
+
1
;
//+1 to accomodate '\0'
char
*
stripped_str
=
m_new
(
char
,
stripped_len
+
1
);
strncpy
(
stripped_str
,
orig_str
+
first_good_char_pos
,
stripped_len
);
stripped_str
[
stripped_len
]
=
'\0'
;
return
mp_obj_new_str
(
qstr_from_str_take
(
stripped_str
,
stripped_len
+
1
));
}
void
vstr_printf_wrapper
(
void
*
env
,
const
char
*
fmt
,
...)
{
va_list
args
;
va_start
(
args
,
fmt
);
...
...
@@ -182,10 +240,12 @@ mp_obj_t str_format(int n_args, const mp_obj_t *args) {
}
static
MP_DEFINE_CONST_FUN_OBJ_2
(
str_join_obj
,
str_join
);
static
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN
(
str_strip_obj
,
1
,
2
,
str_strip
);
static
MP_DEFINE_CONST_FUN_OBJ_VAR
(
str_format_obj
,
1
,
str_format
);
static
const
mp_method_t
str_type_methods
[]
=
{
{
"join"
,
&
str_join_obj
},
{
"strip"
,
&
str_strip_obj
},
{
"format"
,
&
str_format_obj
},
{
NULL
,
NULL
},
// end-of-list sentinel
};
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment