[ create a new paste ] login | about

Link: http://codepad.org/soY31mYl    [ raw code | output | fork ]

C, pasted on Nov 18:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <limits.h>




#define STRTOL_VALIDATE(mp_number) \
    (! ((!  (mp_number) \
         || (mp_number) == LONG_MAX \
         || (mp_number) == LONG_MIN) \
         && errno))




struct name_and_number
{
    char* name;
    int number;
};




struct name_and_number*
name_and_number_parse(
    char const* string
){
    long int number;
    size_t name_size;
    struct name_and_number* self;
    char const* name = strchr(string, ',');

    if (! name) return NULL;
    errno = 0;
    number = strtol(name + 1, NULL, 10);
    if (! STRTOL_VALIDATE(number) || ((int)number) < 1) return NULL;
    name_size = name - string;
    if (! name_size) return NULL;

    if ((self = malloc(sizeof(*self) + name_size + 1)))
    {
        self->name = (char*)(self + 1);
        memcpy(self->name, string, name_size);
        self->name[name_size] = '\0';
        self->number = (int)number;
    }

    return self;
}


#define name_and_number_destroy free
   

void
name_and_number_parse_and_display(
    char const* string
){
    struct name_and_number* parsed;
    
    if ((parsed = name_and_number_parse(string)))
    {
        printf("origin: %s\nname:   %s\nnumber: %d\n\n", 
               string, parsed->name, parsed->number);

        name_and_number_destroy(parsed);
    }

    else
    {
        printf("failed to parse: %s\n\n", string);
    }

    puts("------------------------------------------");
}




int 
main(void)
{
    name_and_number_parse_and_display("Arnul@23,1");
    name_and_number_parse_and_display("00#$%^&@23,Arnuld");
    name_and_number_parse_and_display("Arnuld,");
    name_and_number_parse_and_display("Chris Thomasson, 12.65");
    name_and_number_parse_and_display("John Doe,-1234");
    name_and_number_parse_and_display("Jane Doe");
    name_and_number_parse_and_display("");
    name_and_number_parse_and_display("1234,34345,6");
    name_and_number_parse_and_display("lzkfjclkdsjfaj,asd123");

    puts("\n\n\n___________________________________________\n"
         "The program has completed; hit <ENTER> to exit...");

    getchar();

    return 0;
}


Output:
origin: Arnul@23,1
name:   Arnul@23
number: 1

------------------------------------------
failed to parse: 00#$%^&@23,Arnuld

------------------------------------------
failed to parse: Arnuld,

------------------------------------------
origin: Chris Thomasson, 12.65
name:   Chris Thomasson
number: 12

------------------------------------------
failed to parse: John Doe,-1234

------------------------------------------
failed to parse: Jane Doe

------------------------------------------
failed to parse: 

------------------------------------------
origin: 1234,34345,6
name:   1234
number: 34345

------------------------------------------
failed to parse: lzkfjclkdsjfaj,asd123

------------------------------------------



___________________________________________
The program has completed; hit <ENTER> to exit...


Create a new paste based on this one


Comments: