kparam.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <assert.h>
  5. #include <faux/str.h>
  6. #include <faux/list.h>
  7. #include <klish/khelper.h>
  8. #include <klish/kptype.h>
  9. #include <klish/kparam.h>
  10. struct kparam_s {
  11. char *name;
  12. char *help;
  13. char *ptype_ref; // Text reference to PTYPE
  14. kptype_t *ptype; // Resolved PARAM's PTYPE
  15. faux_list_t *params; // Nested parameters
  16. };
  17. // Simple methods
  18. // Name
  19. KGET_STR(param, name);
  20. // Help
  21. KGET_STR(param, help);
  22. KSET_STR(param, help);
  23. // PTYPE reference (must be resolved later)
  24. KGET_STR(param, ptype_ref);
  25. KSET_STR(param, ptype_ref);
  26. // PTYPE (resolved)
  27. KGET(param, kptype_t *, ptype);
  28. KSET(param, kptype_t *, ptype);
  29. // PARAM list
  30. static KCMP_NESTED(param, param, name);
  31. static KCMP_NESTED_BY_KEY(param, param, name);
  32. KADD_NESTED(param, param);
  33. KFIND_NESTED(param, param);
  34. KNESTED_ITER(param, param);
  35. KNESTED_EACH(param, param);
  36. kparam_t *kparam_new(const char *name)
  37. {
  38. kparam_t *param = NULL;
  39. if (faux_str_is_empty(name))
  40. return NULL;
  41. param = faux_zmalloc(sizeof(*param));
  42. assert(param);
  43. if (!param)
  44. return NULL;
  45. // Initialize
  46. param->name = faux_str_dup(name);
  47. param->help = NULL;
  48. param->ptype_ref = NULL;
  49. param->ptype = NULL;
  50. param->params = faux_list_new(FAUX_LIST_UNSORTED, FAUX_LIST_UNIQUE,
  51. kparam_param_compare, kparam_param_kcompare,
  52. (void (*)(void *))kparam_free);
  53. assert(param->params);
  54. return param;
  55. }
  56. void kparam_free(kparam_t *param)
  57. {
  58. if (!param)
  59. return;
  60. faux_str_free(param->name);
  61. faux_str_free(param->help);
  62. faux_str_free(param->ptype_ref);
  63. faux_list_free(param->params);
  64. faux_free(param);
  65. }