Fixed noninteractive exiting on NULL input to return the last exit
[simpleshell.git] / mystring.c
blob65b45d113f97480dc8e70b11ed15ba8d012d95da
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <ctype.h>
5 #include "mystring.h"
7 MString mystring_new(int size, int incr) {
8 MString string = calloc(1, sizeof(struct mystring));
9 string->str = malloc((size+1)*sizeof(char));
10 string->str[0] = '\0';
11 string->len = 0;
12 string->maxlen = size;
13 string->incr = incr;
15 return string;
18 void mystring_clear(MString string) {
19 string->len = 0;
20 string->str[0] = '\0';
23 void mystring_enlarge(MString string) {
24 string->maxlen += string->incr;
25 string->str = realloc(string->str, (string->maxlen + 1) * sizeof(char));
28 void mystring_char_append(MString string, char toinsert) {
29 if (string->len == string->maxlen) {
30 mystring_enlarge(string);
32 string->str[string->len] = toinsert;
33 string->str[string->len+1] = '\0';
34 string->len++;
37 void mystring_str_append(MString string, char *toinsert) {
38 int i;
39 for (i = 0; toinsert[i] != '\0'; i++) {
40 mystring_char_append(string, toinsert[i]);
44 void mystring_free(MString string) {
45 free(string->str);
46 free(string);
49 int mystring_getline(MString string, FILE *file) {
50 int c;
51 int count = 0;
52 while ((c = fgetc(file)) != EOF && c != '\n') {
53 mystring_char_append(string, c);
54 count++;
56 if (count == 0 && c == EOF) {
57 return -1;
59 return count;
62 void mystring_truncate(MString string, int index) {
63 string->str[index] = '\0';
64 string->len -= string->len - index;
67 void mystring_erase(MString string, int index, int len) {
68 memmove(&string->str[index], &string->str[index+len], string->len-len);
69 string->len -= len;
70 string->str[string->len] = '\0';
73 int mystring_has_prefix(MString string, char *substr) {
74 return !strncmp(string->str, substr, strlen(substr));
77 int mystring_has_suffix(MString string, char *substr) {
78 return !strcmp(string->str + string->len - strlen(substr), substr);
81 int mystring_strip(MString string) {
82 static int i = 0;
83 if (string == NULL) {
84 return i;
87 i = 0;
88 for (i = string->len - 1; i >= 0; i--){
89 if (!isspace(string->str[i])) {
90 break;
93 if (i+1 < string->len) mystring_truncate(string, i+1);
95 for (i = 0; i < string->len; i++) {
96 if (!isspace(string->str[i])) {
97 break;
101 mystring_erase(string, 0, i);
102 return i;