parse a string that supposed to be a disposition and fills up the structure * Returns: -2 : parse error -1 : error * 0 : success */
| 39 | -1 : error |
| 40 | * 0 : success */ |
| 41 | int parse_disposition( str *s, struct disposition *disp) |
| 42 | { |
| 43 | enum { FIND_TYPE, TYPE, END_TYPE, FIND_PARAM, PARAM, END_PARAM, FIND_VAL, |
| 44 | FIND_QUOTED_VAL, QUOTED_VAL, SKIP_QUOTED_VAL, VAL, END_VAL, |
| 45 | F_LF, F_CR, F_CRLF}; |
| 46 | struct disposition_param *disp_p; |
| 47 | struct disposition_param *new_p; |
| 48 | int state; |
| 49 | int saved_state; |
| 50 | char *tmp; |
| 51 | char *end; |
| 52 | |
| 53 | state = saved_state = FIND_TYPE; |
| 54 | end = s->s + s->len; |
| 55 | disp_p = 0; |
| 56 | |
| 57 | for( tmp=s->s; tmp<end; tmp++) { |
| 58 | switch(*tmp) { |
| 59 | case ' ': |
| 60 | case '\t': |
| 61 | switch (state) { |
| 62 | case FIND_QUOTED_VAL: |
| 63 | disp_p->body.s = tmp; |
| 64 | state = QUOTED_VAL; |
| 65 | break; |
| 66 | case SKIP_QUOTED_VAL: |
| 67 | state = QUOTED_VAL; |
| 68 | break; |
| 69 | case TYPE: |
| 70 | disp->type.len = tmp - disp->type.s; |
| 71 | state = END_TYPE; |
| 72 | break; |
| 73 | case PARAM: |
| 74 | disp_p->name.len = tmp - disp_p->name.s; |
| 75 | state = END_PARAM; |
| 76 | break; |
| 77 | case VAL: |
| 78 | disp_p->body.len = tmp - disp_p->body.s; |
| 79 | state = END_VAL; |
| 80 | break; |
| 81 | case F_CRLF: |
| 82 | case F_LF: |
| 83 | case F_CR: |
| 84 | /*previous=crlf and now =' '*/ |
| 85 | state=saved_state; |
| 86 | break; |
| 87 | } |
| 88 | break; |
| 89 | case '\n': |
| 90 | switch (state) { |
| 91 | case TYPE: |
| 92 | disp->type.len = tmp - disp->type.s; |
| 93 | saved_state = END_TYPE; |
| 94 | state = F_LF; |
| 95 | break; |
| 96 | case PARAM: |
| 97 | disp_p->name.len = tmp - disp_p->name.s; |
| 98 | saved_state = END_PARAM; |
no outgoing calls
no test coverage detected