#include #include #include #include static char* fy_event_type_[0x10]; #define map_fy_event_type(t) fy_event_type_[t]=#t #define str_size(str) str,strlen(str) #define tomlerr(...) _tomlerr(__LINE__, __VA_ARGS__) void _tomlerr ( const int line, const char * sub, const char * type, const char * format, ... ) { fprintf(stderr , "[[2yaml"); if(sub) fprintf(stderr , "%s" , sub); fprintf(stderr , "]]\n"); if(line) fprintf(stderr , "\tline = %d\n" , line + 1); if(type) fprintf(stderr , "\ttype = %s\n" , type); const char * info = "info = "; char * infoformat = malloc(strlen(info) + strlen(format) + 1 + (2*strlen("''' "))); char * inff = infoformat; strcpy(inff , "\t"); inff = infoformat; while(*++inff); strcpy(inff , info); inff = infoformat; while(*++inff); strcpy(inff , "''' "); inff = infoformat; while(*++inff); strcpy(inff , format); inff = infoformat; while(*++inff); strcpy(inff , " '''"); va_list ap; va_start(ap , format); fprintf(stderr , infoformat , ap); va_end(ap); fprintf(stderr , "\n"); free(infoformat); } void map_fy_event_type_all() { map_fy_event_type(FYET_NONE); map_fy_event_type(FYET_STREAM_START); map_fy_event_type(FYET_STREAM_END); map_fy_event_type(FYET_DOCUMENT_START); map_fy_event_type(FYET_DOCUMENT_END); map_fy_event_type(FYET_MAPPING_START); map_fy_event_type(FYET_MAPPING_END); map_fy_event_type(FYET_SEQUENCE_START); map_fy_event_type(FYET_SEQUENCE_END); map_fy_event_type(FYET_SCALAR); map_fy_event_type(FYET_ALIAS); } #ifdef NONEMIT int main(void) { struct fy_document * fyd; struct fy_node * root , * item , * key , * value; assert(fyd=fy_document_create(NULL)); if(!(root=fy_node_create_mapping(fyd))) fy_document_destroy(fyd); fy_document_set_root(fyd , root); key = fy_node_create_scalar(fyd , str_size("key")); value = fy_node_create_scalar(fyd , str_size("value")); assert(!fy_node_mapping_append(root , key , value)); assert(!fy_emit_document_to_fp(fyd , FYECF_MODE_JSON , stdout)); fy_document_destroy(fyd); } #else #define ee(em, ...) \ do{ \ struct fy_event * ev = NULL; \ if(!(ev=fy_emit_event_create(em, __VA_ARGS__))) { \ tomlerr(NULL, NULL, "fy_emit_event_create() error"); \ fy_emitter_destroy(em); \ } \ fy_emit_event(em , ev); \ } while(0) #define no_anchor_no_tag NULL, NULL int main(void) { struct fy_emitter * em = NULL; struct fy_emitter_xcfg xcfg; memset(&xcfg , 0 , sizeof(xcfg)); xcfg.cfg.flags = 0 |FYECF_EXTENDED_CFG |FYECF_INDENT_2 |FYECF_VERSION_DIR_OFF //|FYECF_DOC_START_MARK_ON //|FYECF_DOC_END_MARK_ON |FYECF_MODE_BLOCK ; xcfg.cfg.output = fy_emitter_default_output; xcfg.xflags = FYEXCF_COLOR_NONE|FYEXCF_OUTPUT_FILE; //FILE * fp = fopen("2yaml.yaml" , "w"); xcfg.output_fp = fp; xcfg.output_fp = stdout; assert(em=fy_emitter_create((const struct fy_emitter_cfg *)&xcfg)); ee(em, FYET_STREAM_START); ee(em, FYET_DOCUMENT_START, 1, no_anchor_no_tag); ee(em, FYET_MAPPING_START, FYNS_ANY, no_anchor_no_tag); ee(em, FYET_SCALAR, FYNS_ANY, str_size("1"), no_anchor_no_tag); ee(em, FYET_SCALAR, FYNS_ANY, str_size("2"), no_anchor_no_tag); ee(em, FYET_SCALAR, FYNS_ANY, str_size("3"), no_anchor_no_tag); ee(em, FYET_SCALAR, FYNS_ANY, str_size("4"), no_anchor_no_tag); ee(em, FYET_SCALAR, FYNS_ANY, str_size("list"), no_anchor_no_tag); ee(em, FYET_SEQUENCE_START, FYNS_ANY, no_anchor_no_tag); ee(em, FYET_SCALAR, FYSS_SINGLE_QUOTED, str_size("~"), no_anchor_no_tag); ee(em, FYET_SCALAR, FYSS_PLAIN, str_size("~"), no_anchor_no_tag); ee(em, FYET_SCALAR, FYSS_LITERAL, str_size("'"), no_anchor_no_tag); ee(em, FYET_SEQUENCE_END, FYNS_ANY, no_anchor_no_tag); ee(em, FYET_MAPPING_END); ee(em, FYET_DOCUMENT_END, 1, no_anchor_no_tag); ee(em, FYET_STREAM_END); //fclose(fp); fy_emitter_destroy(em); } #endif