|
|
@@ -90,13 +90,14 @@ pkpy_Str pkpy_Str__concat2(const pkpy_Str *self, const char *other, int size){
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
|
-pkpy_Str pkpy_Str__substr(const pkpy_Str *self, int start){
|
|
|
- return pkpy_Str__substr2(self, start, self->size - start);
|
|
|
+pkpy_Str pkpy_Str__slice(const pkpy_Str *self, int start){
|
|
|
+ return pkpy_Str__slice2(self, start, self->size);
|
|
|
}
|
|
|
|
|
|
-pkpy_Str pkpy_Str__substr2(const pkpy_Str *self, int start, int size){
|
|
|
+pkpy_Str pkpy_Str__slice2(const pkpy_Str *self, int start, int stop){
|
|
|
pkpy_Str retval;
|
|
|
- pkpy_Str__ctor2(&retval, pkpy_Str__data(self) + start, size);
|
|
|
+ if(stop < start) stop = start;
|
|
|
+ pkpy_Str__ctor2(&retval, pkpy_Str__data(self) + start, stop - start);
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
|
@@ -174,6 +175,45 @@ pkpy_Str pkpy_Str__escape(const pkpy_Str* self, char quote){
|
|
|
return retval;
|
|
|
}
|
|
|
|
|
|
+// pkpy_Str pkpy_Str__strip(const pkpy_Str *self, bool left, bool right){
|
|
|
+// const char* data = pkpy_Str__data(self);
|
|
|
+// if(self->is_ascii) {
|
|
|
+// int L = 0;
|
|
|
+// int R = self->size;
|
|
|
+// if(left) {
|
|
|
+// while(L < R && (data[L] == ' ' || data[L] == '\t' || data[L] == '\n' || data[L] == '\r'))
|
|
|
+// L++;
|
|
|
+// }
|
|
|
+// if(right) {
|
|
|
+// while(L < R && (data[R - 1] == ' ' || data[R - 1] == '\t' || data[R - 1] == '\n' || data[R - 1] == '\r'))
|
|
|
+// R--;
|
|
|
+// }
|
|
|
+// return pkpy_Str__substr2(self, L, R - L);
|
|
|
+// } else {
|
|
|
+// pkpy_Str tmp;
|
|
|
+// pkpy_Str__ctor(&tmp, " \t\n\r");
|
|
|
+// pkpy_Str retval = pkpy_Str__strip2(self, left, right, &tmp);
|
|
|
+// pkpy_Str__dtor(&tmp);
|
|
|
+// return retval;
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+// pkpy_Str pkpy_Str__strip2(const pkpy_Str *self, bool left, bool right, const pkpy_Str *chars){
|
|
|
+// int L = 0;
|
|
|
+// int R = pkpy_Str__u8_length(self);
|
|
|
+// pkpy_Str tmp;
|
|
|
+// if(left) {
|
|
|
+// tmp = pkpy_Str__u8_getitem(self, L);
|
|
|
+// while(L < R && chars.index(u8_getitem(L)) != -1)
|
|
|
+// L++;
|
|
|
+// }
|
|
|
+// if(right) {
|
|
|
+// while(L < R && chars.index(u8_getitem(R - 1)) != -1)
|
|
|
+// R--;
|
|
|
+// }
|
|
|
+// return pkpy_Str__u8_slice(self, L, R, 1);
|
|
|
+// }
|
|
|
+
|
|
|
pkpy_Str pkpy_Str__replace(const pkpy_Str *self, char old, char new_){
|
|
|
pkpy_Str retval = pkpy_Str__copy(self);
|
|
|
char* p = (char*)pkpy_Str__data(&retval);
|
|
|
@@ -190,13 +230,13 @@ pkpy_Str pkpy_Str__replace2(const pkpy_Str *self, const pkpy_Str *old, const pkp
|
|
|
while(true) {
|
|
|
int i = pkpy_Str__index(self, old, start);
|
|
|
if(i == -1) break;
|
|
|
- pkpy_Str tmp = pkpy_Str__substr2(self, start, i - start);
|
|
|
+ pkpy_Str tmp = pkpy_Str__slice2(self, start, i);
|
|
|
c11_vector__extend(char, &buffer, pkpy_Str__data(&tmp), tmp.size);
|
|
|
pkpy_Str__dtor(&tmp);
|
|
|
c11_vector__extend(char, &buffer, pkpy_Str__data(new_), new_->size);
|
|
|
start = i + old->size;
|
|
|
}
|
|
|
- pkpy_Str tmp = pkpy_Str__substr2(self, start, self->size - start);
|
|
|
+ pkpy_Str tmp = pkpy_Str__slice2(self, start, self->size);
|
|
|
c11_vector__extend(char, &buffer, pkpy_Str__data(&tmp), tmp.size);
|
|
|
pkpy_Str__dtor(&tmp);
|
|
|
c11_vector__push(char, &buffer, '\0');
|
|
|
@@ -221,10 +261,8 @@ int pkpy_Str__cmp2(const pkpy_Str *self, const char *other, int size){
|
|
|
|
|
|
pkpy_Str pkpy_Str__u8_getitem(const pkpy_Str *self, int i){
|
|
|
i = pkpy_Str__unicode_index_to_byte(self, i);
|
|
|
- return pkpy_Str__substr2(
|
|
|
- self, i,
|
|
|
- pkpy_utils__u8_header(pkpy_Str__data(self)[i], false)
|
|
|
- );
|
|
|
+ int size = pkpy_utils__u8_header(pkpy_Str__data(self)[i], false);
|
|
|
+ return pkpy_Str__slice2(self, i, i + size);
|
|
|
}
|
|
|
|
|
|
pkpy_Str pkpy_Str__u8_slice(const pkpy_Str *self, int start, int stop, int step){
|