HV* hash_ppd_option_t( ppd_option_t* option ) { HV* hv; HV* choice; AV* choices; int loop; hv = newHV(); if( option != NULL ) { hv_store( hv, "conflicted", strlen( "conflicted" ), newSViv( option->conflicted ), 0 ); hv_store( hv, "keyword", strlen( "keyword" ), newSVpv( option->keyword, PPD_MAX_NAME ), 0 ); hv_store( hv, "defchoice", strlen( "defchoice" ), newSVpv( option->defchoice, PPD_MAX_NAME ), 0 ); hv_store( hv, "text", strlen( "text" ), newSVpv( option->text, PPD_MAX_NAME ), 0 ); hv_store( hv, "ui", strlen( "ui" ), newSViv( option->ui ), 0 ); hv_store( hv, "section", strlen( "section" ), newSViv( option->section ), 0 ); hv_store( hv, "order", strlen( "order" ), newSViv( option->order ), 0 ); hv_store( hv, "num_choices", strlen( "num_choices" ), newSViv( option->num_choices ), 0 ); choices = newAV(); hv_store( hv, "choices", strlen( "choices" ), newSVsv( newRV( (SV*)choices ) ), 0 ); for( loop = 0; loop < option->num_choices; loop++ ) { choice = newHV(); hv_store( choice, "marked", strlen( "marked" ), newSViv( option->choices[loop].marked ), 0 ); hv_store( choice, "choice", strlen( "choice" ), newSVpv( option->choices[loop].choice, PPD_MAX_NAME ), 0 ); hv_store( choice, "text", strlen( "text" ), newSVpv( option->choices[loop].text, PPD_MAX_NAME ), 0 ); hv_store( choice, "code", strlen( "code" ), newSVpv( option->choices[loop].code, strlen( option->choices[loop].code ) ), 0 ); av_push( choices, newRV( (SV*)choice ) ); } } return( hv ); }