/** Check if codec is in auxiliary list */ static int soa_sdp_is_auxiliary_codec(sdp_rtpmap_t const *rm, char const *auxiliary) { char const *codec; size_t clen, alen; char const *match; if (!rm || !rm->rm_encoding || !auxiliary) return 0; codec = rm->rm_encoding; clen = strlen(codec), alen = strlen(auxiliary); if (clen > alen) return 0; for (match = auxiliary; (match = su_strcasestr(match, codec)); match = match + 1) { if (IS_ALPHANUM(match[clen]) || match[clen] == '-') continue; if (match != auxiliary && (IS_ALPHANUM(match[-1]) || match[-1] == '-')) continue; return 1; } return 0; }
int test_strcasestr(void) { BEGIN(); { char const hs[] = "A case-folding string searching test consisting of a Long String"; char const *s; s = su_strcasestr(hs, "sting"); TEST_S(s, hs + 42); s = su_strcasestr(hs, "String"); TEST_S(s, hs + 15); s = su_strcasestr(hs, "S"); TEST_S(s, hs + 4); s = su_strcasestr(hs, "L"); TEST_S(s, hs + 9); s = su_strcasestr(hs, "trings"); TEST_1(s == NULL); s = su_strcasestr(hs, "String"); TEST_S(s, hs + 15); s = su_strcasestr(hs, "StRiNg"); TEST_S(s, hs + 15); s = su_strcasestr(hs, "OnG"); TEST_S(s, hs + 54); /* Special cases */ TEST_1(su_strcasestr(hs, "") == hs); TEST_1(su_strcasestr("", "ong") == NULL); TEST_1(su_strcasestr("", "OnG") == NULL); TEST_1(su_strcasestr("ong", hs) == NULL); TEST_1(su_strcasestr("OnG", hs) == NULL); TEST_1(su_strcasestr(hs, "Z") == NULL); TEST_1(su_strcasestr(hs, "z") == NULL); TEST_S(su_strcasestr("foobar", "OB"), "obar"); TEST_S(su_strcasestr("FOOBAR", "ob"), "OBAR"); } { char const hs[] = "A case-folding string searching test consisting of a Very Long String\n" "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Integer felis. " "Suspendisse potenti. Morbi malesuada erat eget enim. Sed dui lorem, aliquam " "eu, lobortis eget, dapibus vitae, velit. Cras non purus. Suspendisse massa. " "Curabitur gravida condimentum massa. Donec nunc magna, lacinia non, " "pellentesque ac, laoreet vel, eros. Praesent lectus leo, vestibulum eu, " "tempus eu, ullamcorper tristique, mi. Duis fringilla ultricies lacus. Ut " "non pede. Donec id libero. Cum sociis natoque penatibus et magnis dis " "parturient montes, nascetur ridiculus mus. Phasellus bibendum.\n" "Vestibulum turpis. Nunc euismod. Maecenas venenatis, purus at pharetra " "ultrices, orci orci blandit nisl, eget vulputate enim tortor sed nunc. " "Proin sit amet elit. Donec ut justo. In quis nisi. Praesent posuere. " "Maecenas porta. Curabitur pharetra. Class aptent taciti sociosqu ad litora " "torquent per conubia nostra, per inceptos hymenaeos. Donec suscipit ligula. " "Quisque facilisis ante eget mi. Nunc ac est.\n" "Quisque in sapien eget justo aliquam laoreet. Nullam ultricies est id dolor. " "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Suspendisse ante " "velit, eleifend at, ullamcorper ut, rutrum et, ipsum. Mauris luctus, tellus " "non elementum convallis, nunc ipsum hendrerit lectus, ut lacinia elit nulla " "ac tellus. In sit amet velit. Maecenas non dolor. Sed commodo diam a pede. " "Ut non pede. Vestibulum condimentum turpis vel lacus consectetuer dictum. " "Nulla ullamcorper mi eu pede. Donec mauris tortor, facilisis vitae, " "hendrerit nec, lobortis nec, eros. Nam sit amet mi. Ut pharetra, orci nec " "porta convallis, lacus velit blandit sapien, luctus nonummy lacus dolor vel " "sapien. Suspendisse placerat. Donec ante turpis, volutpat eu, hendrerit " "vel, eleifend ac, arcu. Nulla facilisi. Sed faucibus facilisis lectus. " "Aliquam congue justo nec dui.\n" "Donec dapibus dui sed nisl. Proin congue. Curabitur placerat diam id eros. " "Pellentesque vitae nulla. Quisque at lorem et dolor auctor consequat. Sed " "sed tellus non nibh imperdiet venenatis. Integer ultrices dapibus nisi. " "Aenean vehicula malesuada risus. Fusce egestas malesuada leo. In " "ullamcorper pretium lorem. Vestibulum ante ipsum primis in faucibus orci " "luctus et ultrices posuere cubilia Curae;\n" "Phasellus congue. Morbi lectus arcu, mattis non, pulvinar et, condimentum " "non, mi. Suspendisse vestibulum nunc eu neque. Sed rutrum felis aliquam " "urna. Ut tincidunt orci vitae ipsum. Nullam eros. Quisque augue. Quisque " "lacinia. Nunc ligula diam, nonummy a, porta in, tristique quis, leo. " "Phasellus nunc nulla, fringilla vel, lacinia et, suscipit a, turpis. " "Integer a est. Curabitur mauris lacus, vehicula sit amet, sodales vel, " "iaculis vitae, massa. Nam diam est, ultrices vitae, varius et, tempor a, " "leo. Class aptent taciti sociosqu ad litora torquent per conubia nostra, " "per inceptos hymenaeos. Fusce felis nibh, ullamcorper non, malesuada eget, " "facilisis vel, purus.\n"; char const needle[] = "Proin congue. Curabitur placerat diam id eros. " "Pellentesque vitae nulla. Quisque at lorem et dolor auctor consequat. Sed " "sed tellus non nibh imperdiet venenatis. Integer ultrices dapibus nisi. " "Aenean vehicula malesuada risus. Fusce egestas malesuada leo. In " "ullamcorper pretium lorem. Vestibulum ante ipsum primis in faucibus orci " "luctus et ultrices posuere cubilia Curae;\n"; char const Needle[] = "PROIN CONGUE. CURABITUR PLACERAT DIAM ID EROS. " "PELLENTESQUE VITAE NULLA. QUISQUE AT LOREM ET DOLOR AUCTOR CONSEQUAT. SED " "SED TELLUS NON NIBH IMPERDIET VENENATIS. INTEGER ULTRICES DAPIBUS NISI. " "AENEAN VEHICULA MALESUADA RISUS. FUSCE EGESTAS MALESUADA LEO. IN " "ULLAMCORPER PRETIUM LOREM. VESTIBULUM ANTE IPSUM PRIMIS IN FAUCIBUS ORCI " "LUCTUS ET ULTRICES POSUERE CUBILIA CURAE;\n"; char const *s; s = su_strcasestr(hs, needle); TEST_S(s, hs + 1920); s = su_strcasestr(hs, Needle); TEST_S(s, hs + 1920); } END(); }
/** Update mode within session. * * @sa soatag_hold * * @retval 1 if session was changed (or to be changed, if @a dryrun is nonzero) */ static int soa_sdp_mode_set(sdp_session_t const *user, int const *s2u, sdp_session_t *session, sdp_session_t const *remote, char const *hold, int dryrun) { sdp_media_t *sm; sdp_media_t const *rm, *rm_next, *um; int retval = 0, i, j; int hold_all; int inactive_all; char const *hold_media = NULL; sdp_mode_t send_mode, recv_mode; SU_DEBUG_7(("soa_sdp_mode_set(%p, %p, \"%s\"): called\n", (void *)session, (void *)remote, hold ? hold : "")); if (!session || !session->sdp_media) return 0; rm = remote ? remote->sdp_media : NULL, rm_next = NULL; hold_all = su_strmatch(hold, "*"); inactive_all = su_strmatch(hold, "#"); i = 0; for (sm = session->sdp_media; sm; sm = sm->m_next, rm = rm_next, i++) { rm_next = rm ? rm->m_next : NULL; if (sm->m_rejected) continue; assert(s2u); for (j = 0, um = user->sdp_media; j != s2u[i]; um = um->m_next, j++) { if (!um) break; } if (um == NULL) { if (dryrun) return 1; else retval = 1; sm->m_rejected = 1; sm->m_mode = sdp_inactive; sm->m_port = 0; continue; } send_mode = (sdp_mode_t)(um->m_mode & sdp_sendonly); if (rm) send_mode = (rm->m_mode & sdp_recvonly) ? sdp_sendonly : 0; recv_mode = (sdp_mode_t)(um->m_mode & sdp_recvonly); if (rm && rm->m_mode == sdp_inactive) { send_mode = recv_mode = (sdp_mode_t)0; } else if (inactive_all) { send_mode = recv_mode = (sdp_mode_t)0; } else if (hold_all) { recv_mode = (sdp_mode_t)0; } else if (hold && (hold_media = su_strcasestr(hold, sm->m_type_name))) { recv_mode = (sdp_mode_t)0; hold_media += strlen(sm->m_type_name); hold_media += strspn(hold_media, " \t"); if (hold_media[0] == '=') { hold_media += strspn(hold, " \t"); if (su_casenmatch(hold_media, "inactive", strlen("inactive"))) recv_mode = send_mode = (sdp_mode_t)0; } } if (sm->m_mode != (unsigned)(recv_mode | send_mode)) { if (dryrun) return 1; else retval = 1; sm->m_mode = recv_mode | send_mode; } } return retval; }