ant2009
ant2009

Reputation: 22486

Parsing a string into separate elements

gcc 4.6.2 c89

I am just wondering if this is a good way to parse a string to get the individual elements out of this sdp string.

This is the string:

"v=0\no=sjphone 853596844 1765236571 IN IP4 10.10.10.10\ns=-\nc=IN IP4 10.10.10.10\nt=0 0\nm=audio 19112 RTP/AVP 8\na=rtpmap:8 PCMA/8000\na=ptime:20\n"

And I want to separate it like this:

v=0
o=sjphone 853596844 1765236571 IN IP4 10.10.10.10
s=-
c=IN IP4 10.10.10.10
t=0 0
m=audio 19112 RTP/AVP 8
a=rtpmap:8 PCMA/8000
a=ptime:20

This is my code:

void parse_sdp_string(const char *sdp_string)
{
#define MAX_NUM_ELEMENTS 16    
    char elements[MAX_NUM_ELEMENTS][MAX_STRING_LEN] = {{0}};
    apr_size_t element_count = 0;
    apr_size_t i = 0;
    apr_size_t k = 0;

    char sdp_str[MAX_NUM_ELEMENTS * MAX_STRING_LEN] = {0};
    char *search_str = NULL;

    /* Copy the string as to not corrupt the original */
    apr_cpystrn(sdp_str, sdp_string, sizeof sdp_str);
    search_str = sdp_str;

    /* Find the last carriage return to compare that we are at the last one */
    char *end_ptr = strrchr(search_str, '\n');

    /* Increment until you find a carriage return */
    while(*search_str != '\0') {
        /* Fill the element in the array */
        elements[i][k++] = *search_str;
        search_str++;

        /* nul terminate and reset before starting copy next element */
        if(*search_str == '\n') {
            elements[i][++k] = '\0';
            /* Next element */
            i++;
            /* Set back to zero to copy from */
            k = 0;

            /* Check that we are not at the last '\n' */
            if(search_str == end_ptr) {
                /* This is the end, record the number of elements copied */
                element_count = i;
                break;
            }

            /* skip over the current \n as we don't need to copy that */
            search_str++;
        }
    }
}

Many thanks for any suggestions,

Upvotes: 1

Views: 163

Answers (3)

Eternal_Light
Eternal_Light

Reputation: 686

Using functions like strtok and strstr will make your life a lot easier. Actually almost everything that belongs to the "Searching" group of string.h can be of great use.

Upvotes: 1

Norswap
Norswap

Reputation: 12202

Use sscanf().

With it you can do things like:

int i, n;
float x;
char name[50];
n = sscanf("25 54.32E-1 Hamster", "%d%f%s", &i, &x, name);

which results in i = 25, x = 54.32E-1, name = "Hamster".

Upvotes: 1

Francis Upton IV
Francis Upton IV

Reputation: 19443

I would consider using strtok(). It will save you a lot of code.

Upvotes: 4

Related Questions