#include <stdio.h>
#include <string.h>
#include <malloc.h>
typedef struct tag_string {
char* c_str;
size_t length;
size_t capacity;
} string;
string create_string(const char* str, size_t capacity) {
string ret_val = {0};
ret_val.capacity = capacity;
if (ret_val.length > ret_val.capacity) { /* 指定された大きさのバッファでは足りない */
ret_val.capacity = ret_val.length;
}
ret_val.
c_str = (char*) malloc(sizeof(char) * ret_val.
capacity + sizeof(char)); /* 終端文字を考慮 */ memset(ret_val.
c_str, 0, sizeof(char) * ret_val.
capacity + sizeof(char)); strncpy(ret_val.
c_str, str
, ret_val.
length); return ret_val;
}
void destroy_string(string* p) {
if (p->c_str) {
p->c_str = NULL;
p->length = p->capacity = 0;
}
}
/* begin, end */
char* begin_string(string* str) {
return str->c_str;
}
char* end_string(string* str) {
return str->c_str + str->length; /* 終端文字を返す */
}
const char* cbegin_string(const string* str) {
return str->c_str;
}
const char* cend_string(const string* str) {
return str->c_str + str->length; /* 終端文字を返す */
}
/* copy */
void copy_string(string* s1, const string* s2) {
if (s1->capacity >= s2->length) {
strncpy(s1
->c_str
, s2
->c_str
, s2
->length
); s1->length = s2->length;
memset(end_string
(s1
), 0, (s1
->capacity
- s1
->length
+ 1) * sizeof(char)); return;
}
/* s1のバッファには入りきらない */
string ret_val = create_string(s2->c_str, s2->length);
destroy_string(s1);
*s1 = ret_val;
}
/* compare */
_Bool equal_string(const string* s1, const string* s2) {
return !strcmp(s1
->c_str
, s2
->c_str
); }
int main(void){
string str1 = create_string("abcdef", 6);
string str2 = create_string("abcdefg", 0);
string str3 = create_string("", 10);
copy_string(&str2, &str1);
copy_string(&str3, &str1);
printf("string: %s\nlength: %d\ncapacity:%d\n", str2.c_str, str2.length, str2.capacity);
printf("string: %s\nlength: %d\ncapacity:%d\n", str3.c_str, str3.length, str3.capacity);
if (equal_string(&str1, &str2)) {
}
destroy_string(&str1);
destroy_string(&str2);
destroy_string(&str3);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPG1hbGxvYy5oPgoKdHlwZWRlZiBzdHJ1Y3QgdGFnX3N0cmluZyB7CiAgY2hhciogY19zdHI7CiAgc2l6ZV90IGxlbmd0aDsKICBzaXplX3QgY2FwYWNpdHk7Cn0gc3RyaW5nOwoKc3RyaW5nIGNyZWF0ZV9zdHJpbmcoY29uc3QgY2hhciogc3RyLCBzaXplX3QgY2FwYWNpdHkpIHsKICBzdHJpbmcgcmV0X3ZhbCA9IHswfTsKICByZXRfdmFsLmxlbmd0aCA9IHN0cmxlbihzdHIpOwogIHJldF92YWwuY2FwYWNpdHkgPSBjYXBhY2l0eTsKICBpZiAocmV0X3ZhbC5sZW5ndGggPiByZXRfdmFsLmNhcGFjaXR5KSB7IC8qIOaMh+WumuOBleOCjOOBn+Wkp+OBjeOBleOBruODkOODg+ODleOCoeOBp+OBr+i2s+OCiuOBquOBhCAqLwogICAgcmV0X3ZhbC5jYXBhY2l0eSA9IHJldF92YWwubGVuZ3RoOwogIH0KICByZXRfdmFsLmNfc3RyID0gKGNoYXIqKSBtYWxsb2Moc2l6ZW9mKGNoYXIpICogcmV0X3ZhbC5jYXBhY2l0eSArIHNpemVvZihjaGFyKSk7IC8qIOe1guerr+aWh+Wtl+OCkuiAg+aFriAqLwogIG1lbXNldChyZXRfdmFsLmNfc3RyLCAwLCBzaXplb2YoY2hhcikgKiByZXRfdmFsLmNhcGFjaXR5ICsgc2l6ZW9mKGNoYXIpKTsKICBzdHJuY3B5KHJldF92YWwuY19zdHIsIHN0ciwgcmV0X3ZhbC5sZW5ndGgpOwogIHJldHVybiByZXRfdmFsOwp9Cgp2b2lkIGRlc3Ryb3lfc3RyaW5nKHN0cmluZyogcCkgewogIGlmIChwLT5jX3N0cikgewogICAgZnJlZShwLT5jX3N0cik7CiAgICBwLT5jX3N0ciA9IE5VTEw7CiAgICBwLT5sZW5ndGggPSBwLT5jYXBhY2l0eSA9IDA7CiAgfQp9CgovKiBiZWdpbiwgZW5kICovCmNoYXIqIGJlZ2luX3N0cmluZyhzdHJpbmcqIHN0cikgewogIHJldHVybiBzdHItPmNfc3RyOwp9CmNoYXIqIGVuZF9zdHJpbmcoc3RyaW5nKiBzdHIpIHsKICByZXR1cm4gc3RyLT5jX3N0ciArIHN0ci0+bGVuZ3RoOyAvKiDntYLnq6/mloflrZfjgpLov5TjgZkgKi8KfQpjb25zdCBjaGFyKiBjYmVnaW5fc3RyaW5nKGNvbnN0IHN0cmluZyogc3RyKSB7CiAgcmV0dXJuIHN0ci0+Y19zdHI7Cn0KY29uc3QgY2hhciogY2VuZF9zdHJpbmcoY29uc3Qgc3RyaW5nKiBzdHIpIHsKICByZXR1cm4gc3RyLT5jX3N0ciArIHN0ci0+bGVuZ3RoOyAvKiDntYLnq6/mloflrZfjgpLov5TjgZkgKi8KfQoKLyogY29weSAqLwp2b2lkIGNvcHlfc3RyaW5nKHN0cmluZyogczEsIGNvbnN0IHN0cmluZyogczIpIHsKICBpZiAoczEtPmNhcGFjaXR5ID49IHMyLT5sZW5ndGgpIHsKICAgIHN0cm5jcHkoczEtPmNfc3RyLCBzMi0+Y19zdHIsIHMyLT5sZW5ndGgpOwogICAgczEtPmxlbmd0aCA9IHMyLT5sZW5ndGg7CiAgICBtZW1zZXQoZW5kX3N0cmluZyhzMSksIDAsIChzMS0+Y2FwYWNpdHkgLSBzMS0+bGVuZ3RoICsgMSkgKiBzaXplb2YoY2hhcikpOwogICAgcmV0dXJuOwogIH0KICAvKiBzMeOBruODkOODg+ODleOCoeOBq+OBr+WFpeOCiuOBjeOCieOBquOBhCAqLwogIHN0cmluZyByZXRfdmFsID0gY3JlYXRlX3N0cmluZyhzMi0+Y19zdHIsIHMyLT5sZW5ndGgpOwogIGRlc3Ryb3lfc3RyaW5nKHMxKTsKICAqczEgPSByZXRfdmFsOwp9CgovKiBjb21wYXJlICovCl9Cb29sIGVxdWFsX3N0cmluZyhjb25zdCBzdHJpbmcqIHMxLCBjb25zdCBzdHJpbmcqIHMyKSB7CiAgcmV0dXJuICFzdHJjbXAoczEtPmNfc3RyLCBzMi0+Y19zdHIpOwp9CgoKaW50IG1haW4odm9pZCl7CiAgc3RyaW5nIHN0cjEgPSBjcmVhdGVfc3RyaW5nKCJhYmNkZWYiLCA2KTsKICBzdHJpbmcgc3RyMiA9IGNyZWF0ZV9zdHJpbmcoImFiY2RlZmciLCAwKTsKICBzdHJpbmcgc3RyMyA9IGNyZWF0ZV9zdHJpbmcoIiIsIDEwKTsKICAKICBjb3B5X3N0cmluZygmc3RyMiwgJnN0cjEpOwogIGNvcHlfc3RyaW5nKCZzdHIzLCAmc3RyMSk7CiAgCiAgcHJpbnRmKCJzdHJpbmc6ICVzXG5sZW5ndGg6ICVkXG5jYXBhY2l0eTolZFxuIiwKICAgIHN0cjIuY19zdHIsIHN0cjIubGVuZ3RoLCBzdHIyLmNhcGFjaXR5KTsKICBwcmludGYoInN0cmluZzogJXNcbmxlbmd0aDogJWRcbmNhcGFjaXR5OiVkXG4iLAogICAgc3RyMy5jX3N0ciwgc3RyMy5sZW5ndGgsIHN0cjMuY2FwYWNpdHkpOwogIAogIGlmIChlcXVhbF9zdHJpbmcoJnN0cjEsICZzdHIyKSkgewogICAgcHJpbnRmKCJzdHIxID09IHN0cjJcbiIpOwogIH0KICAKICBkZXN0cm95X3N0cmluZygmc3RyMSk7CiAgZGVzdHJveV9zdHJpbmcoJnN0cjIpOwogIGRlc3Ryb3lfc3RyaW5nKCZzdHIzKTsKICByZXR1cm4gMDsKfQo=