/* - utilities ---------------------------------------------------------- */ struct json_object* asterisk_sip_peers_parser(const char* line, size_t length) { char* name; char* host; char* port; char* status; char* latency; const char* cursor = line; if (strncasecmp(line, "Name/username", 13) == 0 || strcasestr(line, "[Monitored:") != 0) { return NULL; } /* 1 2 3 4 5 6 7 8 012345678901234567890123456789012345678901234567890123456789012345678901234567890 Name/username Host Dyn Nat ACL Port Status */ struct json_object* peer = json_object_new_object(); json_object_object_add(peer, "name", json_object_new_string (trimr(cut_field(line, 0, 26)))); json_object_object_add(peer, "host", json_object_new_string (trimr(cut_field(line, 27, 42)))); json_object_object_add(peer, "port", json_object_new_string (trimr(cut_field(line, 55, 63)))); cursor = parse_field(line + 64, length, (char[]){' ',-1}, &status);
/* * Preprocesses a line applying the necessary transformations * specified by command line options and returns the preprocessed * string, which can be used to compare. */ int preproc(struct bwstring *s, struct keys_array *ka) { if (sort_opts_vals.kflag) for (size_t i = 0; i < keys_num; i++) { struct bwstring *key; struct key_specs *kspecs; struct sort_mods *sm; kspecs = &(keys[i]); key = cut_field(s, kspecs); sm = &(kspecs->sm); if (sm->dflag) key = dictionary_order(key); else if (sm->iflag) key = ignore_nonprinting(key); if (sm->fflag || sm->Mflag) key = ignore_case(key); set_key_on_keys_array(ka, key, i); } else { struct bwstring *ret = NULL; struct sort_mods *sm = default_sort_mods; if (sm->bflag) { if (ret == NULL) ret = bwsdup(s); ret = ignore_leading_blanks(ret); } if (sm->dflag) { if (ret == NULL) ret = bwsdup(s); ret = dictionary_order(ret); } else if (sm->iflag) { if (ret == NULL) ret = bwsdup(s); ret = ignore_nonprinting(ret); } if (sm->fflag || sm->Mflag) { if (ret == NULL) ret = bwsdup(s); ret = ignore_case(ret); } if (ret == NULL) set_key_on_keys_array(ka, s, 0); else set_key_on_keys_array(ka, ret, 0); } return 0; }
int comp_fielded(char *s1, char *s2) { int numeric = 0; // 1 -- string of numbers int reverse = 0; // 1 -- reverse order int caseinsensitive = 0;// 1 -- case insensitive sort int directory = 0; // 1 -- directory order sort /** compare operation */ int (*comp)(void*,void*) = (int (*)(void*,void*))strcmp; int res = 0; int res1 = 0; int res2 = 0; int field_len1 = 0; int field_len2 = 0; // set current processing field field = 0; while (field != fields_count) { comp = (int (*)(void*,void*))strcmp; numeric = options[field][NUMERIC]; reverse = options[field][REVERSE]; caseinsensitive = options[field][CASEINSENSITIVE]; directory = options[field][DIRECTORY]; if (numeric && reverse) comp = (int (*)(void*,void*))numcmp_reverse; else if (numeric) comp = (int (*)(void*,void*))numcmp; else if (caseinsensitive && reverse) comp = (int (*)(void*,void*))strcmp_reverse_incase; else if (reverse) comp = (int (*)(void*,void*))strcmp_reverse; else if (caseinsensitive && directory) comp = (int (*)(void*,void*))dircmp_incase; else if (directory) comp = (int (*)(void*,void*))dircmp; else if (caseinsensitive) comp = (int (*)(void*,void*))strcmp_incase; /** compare strings only till delimiter */ res1 = cut_field(s1); res2 = cut_field(s2); field_len1 = strlen(s1); field_len2 = strlen(s2); res = comp(s1, s2); /** return DELIMITER after cut_field() */ if (!res1) s1[field_len1] = DELIMITER; if (!res2) s2[field_len2] = DELIMITER; if (res == 0) { /** this error checking is duplicate of while()? */ if (res1 && res2) break; else if (res1) return -1; else if (res2) return 1; else { field++; // res = shift_to_delimiter(s1, s2); s1 = s1 + field_len1 + 1; s2 = s2 + field_len2 + 1; // if (res) // break; continue; } } else return res; } return 0; }