#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void itrim(char **val, size_t *len) {
while (*val
&& **val
&& isspace(**val
)) { (*val)++;
(*len)--;
}
while ((*len
) && isspace((*val
)[(*len
) - 1])) { (*len)--;
}
}
void iuse(char *key, size_t klen, char *value, size_t vlen) {
/* original values, original limits */
printf("k: %.*s(%d)\n", (int) klen
, key
, (int) klen
); printf("v: %.*s(%d)\n", (int) vlen
, value
, (int) vlen
);
/* adjust values and limits in place */
itrim(&key, &klen);
itrim(&value, &vlen);
/* adjusted values and limits */
printf("tk: %.*s(%d)\n", (int) klen
, key
, (int) klen
); printf("tv: %.*s(%d)\n", (int) vlen
, value
, (int) vlen
); }
int main(int argc, char **argv) {
char str[] = "Foo : bar\n"; /* you have the header already */
size_t len
= strlen(str
); /* and it's length */
char *split
= strchr(str
, ':');
if (split) {
iuse(
str,
split - str,
&str[split - str + 1],
len - (split - str) - 1
);
}
return 0;
}
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KCnZvaWQgaXRyaW0oY2hhciAqKnZhbCwgc2l6ZV90ICpsZW4pIHsKCXdoaWxlICgqdmFsICYmICoqdmFsICYmIGlzc3BhY2UoKip2YWwpKSB7CgkJKCp2YWwpKys7CgkJKCpsZW4pLS07Cgl9CgoJd2hpbGUgKCgqbGVuKSAmJiBpc3NwYWNlKCgqdmFsKVsoKmxlbikgLSAxXSkpIHsKCQkoKmxlbiktLTsKCX0KfQoKdm9pZCBpdXNlKGNoYXIgKmtleSwgc2l6ZV90IGtsZW4sIGNoYXIgKnZhbHVlLCBzaXplX3QgdmxlbikgewoJLyogb3JpZ2luYWwgdmFsdWVzLCBvcmlnaW5hbCBsaW1pdHMgKi8KCXByaW50ZigiazogJS4qcyglZClcbiIsIChpbnQpIGtsZW4sIGtleSwgKGludCkga2xlbik7CglwcmludGYoInY6ICUuKnMoJWQpXG4iLCAoaW50KSB2bGVuLCB2YWx1ZSwgKGludCkgdmxlbik7CgoJLyogYWRqdXN0IHZhbHVlcyBhbmQgbGltaXRzIGluIHBsYWNlICovCglpdHJpbSgma2V5LCAma2xlbik7CglpdHJpbSgmdmFsdWUsICZ2bGVuKTsKCgkvKiBhZGp1c3RlZCB2YWx1ZXMgYW5kIGxpbWl0cyAqLwoJcHJpbnRmKCJ0azogJS4qcyglZClcbiIsIChpbnQpIGtsZW4sIGtleSwgKGludCkga2xlbik7CglwcmludGYoInR2OiAlLipzKCVkKVxuIiwgKGludCkgdmxlbiwgdmFsdWUsIChpbnQpIHZsZW4pOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKCWNoYXIgc3RyW10gPSAiRm9vIDogYmFyXG4iOyAvKiB5b3UgaGF2ZSB0aGUgaGVhZGVyIGFscmVhZHkgKi8KCXNpemVfdCBsZW4gPSBzdHJsZW4oc3RyKTsgIC8qIGFuZCBpdCdzIGxlbmd0aCAqLwoKCWNoYXIgKnNwbGl0ID0gc3RyY2hyKHN0ciwgJzonKTsKCQoJaWYgKHNwbGl0KSB7CgkJaXVzZSgKCQkJc3RyLCAKCQkJc3BsaXQgLSBzdHIsIAoJCQkmc3RyW3NwbGl0IC0gc3RyICsgMV0sIAoJCQlsZW4gLSAoc3BsaXQgLSBzdHIpIC0gMQoJCSk7Cgl9CgoJcmV0dXJuIDA7Cn0=