This use case might be typical, given data like the following:
{ msgid => "8hgGg33b-a_aj=+2", svc => "LMC", status => [ { reply => "YES", login => "user1", key => "username1", profile => { "macs_name_space/macs/user/email" => "username1@yahoo.com" } }, { reply => "NO", login => "user2" }, { reply => "YES", login => "user3", key => "username3", profile => { "macs_name_space/macs/user/email" => "username3@yahoo.com" } ] }, op => "LOGIN" }
#include <stdlib.h> #include <stdio.h> #include "sedabl.h" #define die() do { sedabl_free(message); fprintf(stderr,"failed to create message block\n"); return NULL; } while (0) sedabl_block *mkblk() { sedabl_block *message, *status, *substatus, *profile; /* create message, populate value sub-blocks */ if (!(message = sedabl_new_listblock("message",NULL))) die(); if (-1 == sedabl_add_str(message,"msgid","8hgGg33b-a_aj=+2")) die(); if (-1 == sedabl_add_str(message,"svc","LMC")) die(); if (-1 == sedabl_add_str(message,"op","LOGIN")) die(); /* create status block, add to message */ if (!(status = sedabl_new_listblock("status",NULL))) die(); if (-1 == sedabl_add_block(message,status)) die(); /* create first substatus, add to status, populate with values */ if (!(substatus = sedabl_new_listblock(NULL,NULL))) die(); if (-1 == sedabl_add_block(status,substatus)) die(); if (-1 == sedabl_add_str(substatus,"reply","YES")) die(); if (-1 == sedabl_add_str(substatus,"login","user1")) die(); if (-1 == sedabl_add_str(substatus,"key","username1")) die(); /* create profile block, add to substatus, populate */ if (!(profile = sedabl_new_listblock("profile",NULL))) die(); if (-1 == sedabl_add_block(substatus,profile)) die(); if (-1 == sedabl_add_str(profile,"macs_name_space/macs/user/email","username1@yahoo.com")) die(); /* create second substatus, add to status, populate with values */ if (!(substatus = sedabl_new_listblock(NULL,NULL))) die(); if (-1 == sedabl_add_block(status,substatus)) die(); if (-1 == sedabl_add_str(substatus,"reply","NO")) die(); if (-1 == sedabl_add_str(substatus,"login","user2")) die(); /* create third substatus, add to status, populate with values */ if (!(substatus = sedabl_new_listblock(NULL,NULL))) die(); if (-1 == sedabl_add_block(status,substatus)) die(); if (-1 == sedabl_add_str(substatus,"reply","YES")) die(); if (-1 == sedabl_add_str(substatus,"login","user3")) die(); if (-1 == sedabl_add_str(substatus,"key","username3")) die(); /* create profile block, add to substatus, populate */ if (!(profile = sedabl_new_listblock("profile",NULL))) die(); if (-1 == sedabl_add_block(substatus,profile)) die(); if (-1 == sedabl_add_str(profile,"macs_name_space/macs/user/email","username3@yahoo.com")) die(); return message; } #define INDENT for (i=0; i < depth; i++) fputs("\t",stdout) int showblk(sedabl_block *block,int depth) { int i; char f[256]; if (!block) return 0; /* no block to display */ INDENT; printf("Key:%s",block->key); if (block->is_list) { printf(", is a list:\n"); for (i=0; i < block->payload.list->elements; i++) /* for each sub-block... */ if (!showblk(block->payload.list->blocks[i],depth+1)) /* ...display it */ return 0; /* couldn't display a sub-block */ return 1; } else { printf(", is a value. As string:\n"); INDENT; if (snprintf(f,256,"\t``%%.%ds''\n",block->payload.value->len) > 255) return 0; /* failed to create format string */ printf(f,block->payload.value->val); return 1; } } int main() { return !showblk(mkblk(),0); }