Esempio n. 1
0
void config_write(const config_t *config, FILE *stream)
{
  __config_locale_override();

  __config_write_setting(config->root, stream, 0, config->tab_width);

  __config_locale_restore();
}
Esempio n. 2
0
LIBCONFIG_API void config_write(const config_t *config, FILE *stream)
{
  __config_write_setting(config->root, stream, 0);
}
Esempio n. 3
0
static void __config_write_value(const config_value_t *value, int type,
                                 int format, int depth,
                                 unsigned short tab_width, FILE *stream)
{
  char fbuf[64];

  switch(type)
  {
    /* boolean */
    case CONFIG_TYPE_BOOL:
      fputs(value->ival ? "true" : "false", stream);
      break;

    /* int */
    case CONFIG_TYPE_INT:
      switch(format)
      {
        case CONFIG_FORMAT_HEX:
          fprintf(stream, "0x%X", value->ival);
          break;

        case CONFIG_FORMAT_DEFAULT:
        default:
          fprintf(stream, "%d", value->ival);
          break;
      }
      break;

    /* 64-bit int */
    case CONFIG_TYPE_INT64:
      switch(format)
      {
        case CONFIG_FORMAT_HEX:
          fprintf(stream, "0x" INT64_HEX_FMT "L", value->llval);
          break;

        case CONFIG_FORMAT_DEFAULT:
        default:
          fprintf(stream, INT64_FMT "L", value->llval);
          break;
      }
      break;

    /* float */
    case CONFIG_TYPE_FLOAT:
    {
      char *q;

      snprintf(fbuf, sizeof(fbuf) - 3, "%.*g", FLOAT_PRECISION, value->fval);

      /* check for exponent */
      q = strchr(fbuf, 'e');
      if(! q)
      {
        /* no exponent */
        if(! strchr(fbuf, '.')) /* no decimal point */
          strcat(fbuf, ".0");
        else
        {
          /* has decimal point */
          char *p;

          for(p = fbuf + strlen(fbuf) - 1; p > fbuf; --p)
          {
            if(*p != '0')
            {
              *(++p) = '\0';
              break;
            }
          }
        }
      }

      fputs(fbuf, stream);
      break;
    }

    /* string */
    case CONFIG_TYPE_STRING:
    {
      char *p;

      fputc('\"', stream);

      if(value->sval)
      {
        for(p = value->sval; *p; p++)
        {
          int c = (int)*p & 0xFF;
          switch(c)
          {
            case '\"':
            case '\\':
              fputc('\\', stream);
              fputc(c, stream);
              break;

            case '\n':
              fputs("\\n", stream);
              break;

            case '\r':
              fputs("\\r", stream);
              break;

            case '\f':
              fputs("\\f", stream);
              break;

            case '\t':
              fputs("\\t", stream);
              break;

            default:
              if(c >= ' ')
                fputc(c, stream);
              else
                fprintf(stream, "\\x%02X", c);
          }
        }
      }
      fputc('\"', stream);
      break;
    }

    /* list */
    case CONFIG_TYPE_LIST:
    {
      config_list_t *list = value->list;

      fprintf(stream, "( ");

      if(list)
      {
        int len = list->length;
        config_setting_t **s;

        for(s = list->elements; len--; s++)
        {
          __config_write_value(&((*s)->value), (*s)->type, (*s)->format,
                               depth + 1, tab_width, stream);

          if(len)
            fputc(',', stream);

          fputc(' ', stream);
        }
      }

      fputc(')', stream);
      break;
    }

    /* array */
    case CONFIG_TYPE_ARRAY:
    {
      config_list_t *list = value->list;

      fprintf(stream, "[ ");

      if(list)
      {
        int len = list->length;
        config_setting_t **s;

        for(s = list->elements; len--; s++)
        {
          __config_write_value(&((*s)->value), (*s)->type, (*s)->format,
                               depth + 1, tab_width, stream);

          if(len)
            fputc(',', stream);

          fputc(' ', stream);
        }
      }

      fputc(']', stream);
      break;
    }

    /* group */
    case CONFIG_TYPE_GROUP:
    {
      config_list_t *list = value->list;

      if(depth > 0)
      {
#ifdef K_AND_R_STYLE /* Horrendous, but many people like it. */
        fputc(' ', stream);
#else
        fputc('\n', stream);

        if(depth > 1)
          __config_indent(stream, depth, tab_width);
#endif
        fprintf(stream, "{\n");
      }

      if(list)
      {
        int len = list->length;
        config_setting_t **s;

        for(s = list->elements; len--; s++)
          __config_write_setting(*s, stream, depth + 1, tab_width);
      }

      if(depth > 1)
        __config_indent(stream, depth, tab_width);

      if(depth > 0)
        fputc('}', stream);

      break;
    }

    default:
      /* this shouldn't happen, but handle it gracefully... */
      fputs("???", stream);
      break;
  }
}
Esempio n. 4
0
static void __config_write_value(const config_value_t *value, int type,
                                 int format, int depth, FILE *stream)
{
  switch(type)
  {
    // boolean
    case CONFIG_TYPE_BOOL:
      fputs(value->bval ? "true" : "false", stream);
      break;
      
    case CONFIG_TYPE_INT:
      switch(format)
      {
        case CONFIG_FORMAT_HEX:
          fprintf(stream, "0x%lX", (unsigned long)value->ival);
          break;
          
        case CONFIG_FORMAT_DEFAULT:
        default:
          fprintf(stream, "%ld", value->ival);
          break;
      }
      break;
      
      // float
    case CONFIG_TYPE_FLOAT:
      fprintf(stream, "%e", value->fval);
      break;

      // string
    case CONFIG_TYPE_STRING:
    {
      char *p;

      fputc('\"', stream);

      if(value->sval)
      {
        for(p = value->sval; *p; p++)
        {
          switch(*p)
          {
            case '\"':
            case '\\':
              fputc('\\', stream);
              fputc(*p, stream);
              break;
              
            case '\n':
              fputs("\\n", stream);
              break;
              
            case '\r':
              fputs("\\r", stream);
              break;
              
            case '\f':
              fputs("\\f", stream);
              break;
              
            case '\t':
              fputs("\\t", stream);
              break;
              
            default:
              fputc(*p, stream);
          }
        }
      }
      fputc('\"', stream);
      break;
    }
      
    // list
    case CONFIG_TYPE_LIST:
    {
      config_list_t *list = value->list;
        
      fprintf(stream, "( ");

      if(list)
      {
        int len = list->length;
        config_setting_t **s;

        for(s = list->elements; len--; s++)
        {
          __config_write_value(&((*s)->value), (*s)->type, (*s)->format,
                               depth + 1, stream);

          if(len)
            fputc(',', stream);
          
          fputc(' ', stream);
        }
      }
      
      fputc(')', stream);
      break;
    }

    // array
    case CONFIG_TYPE_ARRAY:
    {
      config_list_t *list = value->list;
        
      fprintf(stream, "[ ");

      if(list)
      {
        int len = list->length;
        config_setting_t **s;

        for(s = list->elements; len--; s++)
        {
          __config_write_value(&((*s)->value), (*s)->type, (*s)->format,
                               depth + 1, stream);

          if(len)
            fputc(',', stream);
          
          fputc(' ', stream);
        }
      }
      
      fputc(']', stream);
      break;
    }

    // group
    case CONFIG_TYPE_GROUP:
    {
      config_list_t *list = value->list;

      if(depth > 0)
      {
        fputc('\n', stream);
        
        if(depth > 1)
          fprintf(stream, "%*s", (depth - 1) * 2, " ");
        fprintf(stream, "{\n");
      }
      
      if(list)
      {
        int len = list->length;
        config_setting_t **s;

        for(s = list->elements; len--; s++)
          __config_write_setting(*s, stream, depth + 1);
      }

      if(depth > 1)
        fprintf(stream, "%*s", (depth - 1) * 2, " ");
      
      if(depth > 0)
        fputc('}', stream);
      
      break;
    }

    default:
      // this shouldn't happen, but handle it gracefully...
      fputs("???", stream);
      break;
  }
}