数据格式解析

#include <stdio.h>
#include "yaml.h"
#define VALUE_FLAG 0
#define KEY_FLAG 1
typedef struct MAP
{
    //int key_size;
    //int value_size;
    char key[20];
    char value[20];
}Map;

int main(void)
{
  int key_value_size = 20;
  Map* maps = (Map*)malloc(sizeof(Map)*key_value_size);
  int flag;
  int key_cnt = 0;
  int value_cnt = 0;
  int total_cnt = 0;

  FILE *fh = fopen("config/liteservice.yaml", "r");
  yaml_parser_t parser;
  yaml_token_t  token;   /* new variable */

  /* Initialize parser */
  if(!yaml_parser_initialize(&parser))
    fputs("Failed to initialize parser!\n", stderr);
  if(fh == NULL)
    fputs("Failed to open file!\n", stderr);

  /* Set input file */
  yaml_parser_set_input_file(&parser, fh);

  /* BEGIN new code */
  do {
    yaml_parser_scan(&parser, &token);
    switch(token.type)
    {
    /* Stream start/end */
    case YAML_STREAM_START_TOKEN: puts("STREAM START"); break;
    case YAML_STREAM_END_TOKEN:   puts("STREAM END");   break;
    /* Token types (read before actual token) */
    case YAML_KEY_TOKEN:   
        printf("(Key token)   ");
        flag = KEY_FLAG;
        break;
    case YAML_VALUE_TOKEN: 
        printf("(Value token) ");
        flag = VALUE_FLAG;
        break;
    /* Block delimeters */
    case YAML_BLOCK_SEQUENCE_START_TOKEN: puts("<b>Start Block (Sequence)</b>"); break;
    case YAML_BLOCK_ENTRY_TOKEN:          puts("<b>Start Block (Entry)</b>");    break;
    case YAML_BLOCK_END_TOKEN:            puts("<b>End block</b>");              break;
    /* Data */
    case YAML_BLOCK_MAPPING_START_TOKEN:  
        puts("[Block mapping]");
        if(key_cnt != 0)
        {
            strcpy(maps[value_cnt].value,"block");
            value_cnt++;
            flag = KEY_FLAG;
        }       
        break;
    case YAML_SCALAR_TOKEN:  
        printf("scalar %s \n", token.data.scalar.value);
        if(flag == KEY_FLAG)
        {
            strcpy(maps[key_cnt].key,token.data.scalar.value);
            key_cnt++;
            //maps[cnt].key = (char*)event.data.scalar.value;
            flag = VALUE_FLAG;
        }
        else
        {
            strcpy(maps[value_cnt].value,token.data.scalar.value);
            value_cnt++;
            flag = KEY_FLAG;
        }
        break;
        break;
    /* Others */
    default:
      printf("Got token of type %d\n", token.type);
    }
    if(token.type != YAML_STREAM_END_TOKEN)
      yaml_token_delete(&token);
  } while(token.type != YAML_STREAM_END_TOKEN);
  yaml_token_delete(&token);
  /* END new code */

  /* Cleanup */
  yaml_parser_delete(&parser);
  fclose(fh);

  int i;
  for(i = 0;i< key_cnt ;i++)
  {
    printf(" map[i].key = %s \n",maps[i].key);
  }

  for(i = 0;i< value_cnt ;i++)
  {
    printf(" map[i].value = %s \n",maps[i].value);
  }

  return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值