int add_param_to_list()

in libs/signature/src/param_list.c [58:109]


int add_param_to_list(SPAS_PARAM_LIST *list, const char *name,
                      const char *value) {
  SPAS_PARAM_NODE *pnode = NULL;
  SPAS_PARAM_NODE *plast = NULL;
  int nlen = 0;
  int vlen = 0;
  if (list == NULL || name == NULL || value == NULL) {
    return ERROR_INVALID_PARAM;
  }
  nlen = strlen(name);
  vlen = strlen(value);
  pnode = (SPAS_PARAM_NODE *)_mem_alloc(sizeof(SPAS_PARAM_NODE));
  if (pnode == NULL) {
    return ERROR_MEM_ALLOC;
  }
  pnode->name = (char *)_mem_alloc(nlen + 1);
  if (pnode->name == NULL) {
    _mem_free(pnode);
    return ERROR_MEM_ALLOC;
  }
  pnode->value = (char *)_mem_alloc(vlen + 1);
  if (pnode->value == NULL) {
    _mem_free(pnode->name);
    _mem_free(pnode);
    return ERROR_MEM_ALLOC;
  }
  memcpy(pnode->name, name, nlen);
  memcpy(pnode->value, value, vlen);
  if (list->phead == NULL) {
    list->phead = pnode;
  } else if (_nodecmp(pnode, list->phead) <= 0) {
    pnode->pnext = list->phead;
    list->phead = pnode;
  } else {
    plast = list->phead;
    while (plast->pnext != NULL) {
      if (_nodecmp(pnode, plast->pnext) <= 0) {
        pnode->pnext = plast->pnext;
        plast->pnext = pnode;
        break;
      } else {
        plast = plast->pnext;
      }
    }
    if (plast->pnext == NULL) {
      plast->pnext = pnode;
    }
  }
  list->length++;
  list->size += nlen + vlen + 1; /* 1 overhead for '=' */
  return SPAS_NO_ERROR;
}