feat: store parsed results fully in heap
This commit is contained in:
parent
ad3edd850b
commit
678a44228f
64
parslib.c
64
parslib.c
|
@ -120,6 +120,36 @@ void fretres(void) {
|
|||
frenod(header_tree);
|
||||
}
|
||||
|
||||
void frepareq(struct httpareq *req) {
|
||||
struct httitlereq *titl = &req->titl;
|
||||
free(titl->uri.er);
|
||||
free(titl->ver.er);
|
||||
|
||||
for (int i = 0; i < header_count; i++) {
|
||||
struct point *e = &req->hentries[i];
|
||||
if (!e->er) {
|
||||
continue;
|
||||
}
|
||||
|
||||
free(e->er);
|
||||
}
|
||||
}
|
||||
|
||||
void frepares(struct httpares *res) {
|
||||
struct httitleres *titl = &res->titl;
|
||||
free(titl->ver.er);
|
||||
free(titl->stxt.er);
|
||||
|
||||
for (int i = 0; i < header_count; i++) {
|
||||
struct point *e = &res->hentries[i];
|
||||
if (!e->er) {
|
||||
continue;
|
||||
}
|
||||
|
||||
free(e->er);
|
||||
}
|
||||
}
|
||||
|
||||
int readlin(char **buff, char **buff_lim) {
|
||||
int diff = 0;
|
||||
if ((*buff) >= (*buff_lim)) {
|
||||
|
@ -180,8 +210,12 @@ _loop:
|
|||
|
||||
// header value
|
||||
diff = cursor_lim-cursor;
|
||||
char *e = strndup(cursor, diff);
|
||||
if (!e) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
hentries[key].er = cursor;
|
||||
hentries[key].er = e;
|
||||
hentries[key].len = diff;
|
||||
|
||||
return 0;
|
||||
|
@ -231,7 +265,12 @@ _loop1:
|
|||
}
|
||||
|
||||
diff = uri_lim-cursor;
|
||||
titl->uri.er = cursor;
|
||||
char *e = strndup(cursor, diff);
|
||||
if (!e) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
titl->uri.er = e;
|
||||
titl->uri.len = diff;
|
||||
|
||||
cursor += diff;
|
||||
|
@ -248,7 +287,12 @@ _loop2:
|
|||
|
||||
// ver
|
||||
diff = cursor_lim-cursor;
|
||||
titl->ver.er = cursor;
|
||||
e = strndup(cursor, diff);
|
||||
if (!e) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
titl->ver.er = e;
|
||||
titl->ver.len = diff;
|
||||
|
||||
cursor += diff;
|
||||
|
@ -272,7 +316,12 @@ int parestitl(char *offset, int len, struct httitleres *titl) {
|
|||
}
|
||||
|
||||
diff = ver_lim-cursor;
|
||||
titl->ver.er = cursor;
|
||||
char *e = strndup(cursor, diff);
|
||||
if (!e) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
titl->ver.er = e;
|
||||
titl->ver.len = diff;
|
||||
|
||||
cursor += diff;
|
||||
|
@ -318,7 +367,12 @@ _loop2:
|
|||
|
||||
// status text
|
||||
diff = cursor_lim-cursor;
|
||||
titl->stxt.er = cursor;
|
||||
e = strndup(cursor, diff);
|
||||
if (!e) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
titl->stxt.er = e;
|
||||
titl->stxt.len = diff;
|
||||
|
||||
cursor += diff;
|
||||
|
|
|
@ -167,6 +167,8 @@ struct httpares {
|
|||
|
||||
int initres(void);
|
||||
void fretres(void);
|
||||
void frepareq(struct httpareq *req);
|
||||
void frepares(struct httpares *res);
|
||||
int readlin(char **buff, char **buff_lim);
|
||||
int parshfield(char *offset, int len, /* out */ struct point *hentries);
|
||||
|
||||
|
|
4
test.c
4
test.c
|
@ -72,6 +72,8 @@ int main(void) {
|
|||
fprintf(stdout, "-------------------------------------\n");
|
||||
printfpareq(req);
|
||||
fprintf(stdout, "-------------------------------------\n");
|
||||
|
||||
frepareq(req);
|
||||
}
|
||||
fprintf(stdout, "xxxRESxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n");
|
||||
for (char *ch = strtok(reses, "|"); ch != NULL; ch = strtok(NULL, "|")) {
|
||||
|
@ -79,6 +81,8 @@ int main(void) {
|
|||
fprintf(stdout, "-------------------------------------\n");
|
||||
printfpares(res);
|
||||
fprintf(stdout, "-------------------------------------\n");
|
||||
|
||||
frepares(res);
|
||||
}
|
||||
fprintf(stdout, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n");
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user