示例#1
0
/**
 * MR_BITMASK type saving handler. Look up type descriptor and save as
 * stringified bitmask value or as integer otherwise.
 * @param ptrdes descriptor of the saved field
 * @param bitmask_or_delimiter delimiter for OR statement
 * @return stringified enum value
 */
char *
mr_stringify_bitmask (mr_ptrdes_t * ptrdes, char * bitmask_or_delimiter)
{
  int i, count;
  uint64_t value = 0;
  char * str = NULL;
  mr_td_t * tdp = mr_get_td_by_name (ptrdes->fd.type); /* look up for type descriptor */

  /* check whether type descriptor was found */
  if (NULL == tdp)
    {
      MR_MESSAGE (MR_LL_WARN, MR_MESSAGE_NO_TYPE_DESCRIPTOR, ptrdes->fd.type);
      return (mr_stringify_uint (ptrdes));
    }

  if (MR_TYPE_ENUM != tdp->mr_type)
    {
      MR_MESSAGE (MR_LL_WARN, MR_MESSAGE_TYPE_NOT_ENUM, ptrdes->fd.type);
      return (mr_stringify_uint (ptrdes));
    }

  value = mr_get_enum_value (tdp, ptrdes->data);

  if (0 == value)
    {
      mr_fd_t * fdp = mr_get_enum_by_value (tdp, value);
      return (MR_STRDUP (fdp && fdp->name.str ? fdp->name.str : "0"));
    }

  /* decompose value on bitmask */
  count = tdp->fields.size / sizeof (tdp->fields.data[0]);
  for (i = 0; i < count; ++i)
    {
      mr_fd_t * fdp = tdp->fields.data[i].fdp;
      if ((value & fdp->param.enum_value) && !(~value & fdp->param.enum_value))
	{
	  if (NULL == str)
	    str = MR_STRDUP (fdp->name.str);
	  else
	    str = mr_decompose_bitmask_add (str, bitmask_or_delimiter, fdp->name.str);
	  if (NULL == str)
	    break;
	  value &= ~fdp->param.enum_value;
	}
      if (0 == value)
	break;
    }

  if (value != 0)
    {
      /* save non-matched part as integer */
      mr_ptrdes_t ptrdes = { .data = &value, };
      char * number = mr_stringify_uint64_t (&ptrdes);
      if (number != NULL)
	{
	  str = mr_decompose_bitmask_add (str, bitmask_or_delimiter, number);
	  MR_FREE (number);
	}
      MR_MESSAGE (MR_LL_WARN, MR_MESSAGE_SAVE_BITMASK, value);
    }
示例#2
0
文件: object.c 项目: xinhaoyuan/mr
void
mr_object_host_free(mr_object_t object)
{
    if (!HAS_GC_HEADER(object)) return;
    mr_gc_header_t gc = MR_TO_GC_HEADER(object);
    
    if (gc->gc_status == GC_STATUS_HOST)
    {
        gc->type->free(gc->type, object);
        MR_FREE(gc);
    }
}
示例#3
0
static char *
mr_decompose_bitmask_add (char * str, char * bitmask_or_delimiter, char * token)
{
  char * str_ = MR_REALLOC (str, strlen (str) + strlen (bitmask_or_delimiter) + strlen (token) + 1);
  if (NULL == str_)
    {
      MR_MESSAGE (MR_LL_FATAL, MR_MESSAGE_OUT_OF_MEMORY);
      MR_FREE (str);
    }
  else
    {
      strcat (str_, bitmask_or_delimiter);
      strcat (str_, token);
    }
  return (str_);
}
示例#4
0
/**
 * MR_BITMASK type saving handler. Look up type descriptor and save as
 * stringified bitmask value or as integer otherwise.
 * @param idx an index of node in ptrs
 * @param ptrs resizeable array with pointers descriptors
 * @return stringified enum value
 */
static char *
scm_save_bitmask (int idx, mr_ra_mr_ptrdes_t * ptrs)
{
  char * str = mr_stringify_bitmask (&ptrs->ra.data[idx], MR_SCM_BITMASK_OR_DELIMITER);
  if (str)
    {
      char * str_ = MR_MALLOC ((sizeof (MR_SCM_BITMASK_TEMPLATE) - 1) + (strlen (str) - 2) + 1);
      if (NULL == str_)
	{
	  MR_MESSAGE (MR_LL_FATAL, MR_MESSAGE_OUT_OF_MEMORY);
	  return (NULL);
	}
      sprintf (str_, MR_SCM_BITMASK_TEMPLATE, str);
      MR_FREE (str);
      str = str_;
    }
  return (str);
}
int main ()
{
  int x = 1234;
  int y = 4321;
  int_pointer_t x_ptr = { &x };
  int_dbl_pointer_t idp = { &x_ptr, &y };
  char * xml = MR_SAVE_XML (int_dbl_pointer_t, &idp);

  if (NULL == xml)
    printf ("Serialization failed\n");
  else
    {
      printf ("%s", xml);
      MR_FREE (xml);
    }

  return (EXIT_SUCCESS);
}
int main ()
{
  char type[] = "example_t";
  mr_td_t * td = mr_get_td_by_name (type);
  if (NULL == td)
    printf ("error: can't obtain type information for type '%s'\n", type);
  else
    {
      char * td_serialized = MR_SAVE_CINIT (mr_td_t, td);
      if (NULL == td_serialized)
	printf ("error: can't serialize desciptor for type '%s'\n", type);
      else
	{
	  printf ("Type desciptor for type '%s' is\n%s\n", type, td_serialized);
	  MR_FREE (td_serialized);
	}
    }
  return (EXIT_SUCCESS);
}
示例#7
0
static void
mr_value_id (mr_value_t * value)
{
  if (MR_VT_ID != value->value_type)
    return;

  value->value_type = MR_VT_INT;
  if (NULL == value->vt_string)
    value->vt_int = 0;
  else
    {
      mr_fd_t * fdp = mr_get_enum_by_name (value->vt_string);
      __typeof__ (value->vt_int) vt_int = 0;
      if (NULL == fdp)
	MR_MESSAGE (MR_LL_WARN, MR_MESSAGE_UNKNOWN_ENUM, value->vt_string);
      else
	vt_int = fdp->param.enum_value;
      MR_FREE (value->vt_string);
      value->vt_int = vt_int;
    }
}
示例#8
0
int
mr_io_cs_parse_token(mr_io_char_stream_in_f in, void *stream, char **buf, unsigned int *size)
{
    int          type;
    char        *token_buf;
    unsigned int token_len;
    unsigned int token_buf_alloc = 0;

    type = -1;
    token_buf = NULL;
    token_len = 0;

#define EXPAND_TOKEN                                                    \
    while (token_buf_alloc < token_len)                                 \
    {                                                                   \
        token_buf_alloc = (token_buf_alloc << 1) + 1;                   \
        if (token_buf == NULL)                                          \
            token_buf = (char *)MR_MALLOC(sizeof(char) * token_buf_alloc); \
        else token_buf = (char *)MR_REALLOC(token_buf, sizeof(char) * token_buf_alloc); \
        if (token_buf == NULL) return -1;                               \
    }
    
    while (1)
    {
        int now = in(stream, MR_IO_CS_IN_PEEK);
        if (now < 0)
        {
            if (token_len > 0)
                type = MR_TOKEN_SYMBOL;
            else type = MR_TOKEN_EOF;
            break;
        }

        if (MR_CHAR_IS_SEPARATOR(now))
        {
            while (1)
            {
                in(stream, MR_IO_CS_IN_ADVANCE);
                now = in(stream, MR_IO_CS_IN_PEEK);
                if (MR_CHAR_IS_SEPARATOR(now)) continue;
                break;
            }
            
            if (token_len > 0)
            {
                type = MR_TOKEN_SYMBOL;
                break;
            }
            else if (now < 0) break;
        }

        if (now == MR_TOKEN_CHAR_LC || now == MR_TOKEN_CHAR_RC)
        {
            if (token_len > 0)
            {
                type = MR_TOKEN_SYMBOL;
                break;
            }
            else
            {
                in(stream, MR_IO_CS_IN_ADVANCE);
                
                if (now == MR_TOKEN_CHAR_LC)
                    type = MR_TOKEN_LC;
                else type = MR_TOKEN_RC;
                
                break;
            }
        }

        if (now == MR_TOKEN_CHAR_COMMENT)
        {
            in(stream, MR_IO_CS_IN_ADVANCE);
            while (1)
            {
                now = in(stream, MR_IO_CS_IN_PEEK);
                if (now < 0 || MR_CHAR_IS_NEWLINE(now))
                {
                    while (1)
                    {
                        now = in(stream, MR_IO_CS_IN_PEEK);
                        if (now < 0 || !MR_CHAR_IS_NEWLINE(now))
                            break;
                        else in(stream, MR_IO_CS_IN_ADVANCE);
                    }
                    break;
                }
                else in(stream, MR_IO_CS_IN_ADVANCE);
            }
            continue;
        }

        if (now == MR_TOKEN_CHAR_QUOTE)
        {
            if (token_len > 0)
            {
                type = MR_TOKEN_SYMBOL;
                break;
            }
            else
            {
                in(stream, MR_IO_CS_IN_ADVANCE);
                type = MR_TOKEN_STRING;
                
                while (1)
                {
                    now = in(stream, MR_IO_CS_IN_ADVANCE);
                    if (now < 0 || now == MR_TOKEN_CHAR_QUOTE)
                    {
                        break;
                    }
                    else if (now == MR_TOKEN_CHAR_ESCAPE)
                    {
                        now = in(stream, MR_IO_CS_IN_ADVANCE);
                        if (now < 0)
                        {
                            break;
                        }
                        
                        ++ token_len;
                        EXPAND_TOKEN;

                        switch (now)
                        {
                        case 'n':
                            token_buf[token_len - 1] = '\n';
                            break;

                        case 'r':
                            token_buf[token_len - 1] = '\r';
                            break;

                        default:
                            token_buf[token_len - 1] = now;
                            break;
                        }
                    }
                    else
                    {
                        ++ token_len;
                        EXPAND_TOKEN;
                        token_buf[token_len - 1] = now;
                    }
                }

                break;
            }
        }

        ++ token_len;
        EXPAND_TOKEN;
        token_buf[token_len - 1] = now;

        in(stream, MR_IO_CS_IN_ADVANCE);
    }
#undef EXPAND_TOKEN

    if ((*size = token_len) > 0)
    {
        *buf = (char *)MR_REALLOC(token_buf, token_len);
    }
    else if (token_buf != NULL)
        MR_FREE(token_buf);
    return type;
}