kpargv.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /** @file kpargv.c
  2. */
  3. #include <assert.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <faux/list.h>
  8. #include <klish/khelper.h>
  9. #include <klish/kcommand.h>
  10. #include <klish/kparam.h>
  11. #include <klish/kpargv.h>
  12. struct kpargv_s {
  13. kcommand_t *command;
  14. faux_list_t *pargs;
  15. };
  16. // Command
  17. KGET(pargv, kcommand_t *, command);
  18. KSET(pargv, kcommand_t *, command);
  19. // Pargs
  20. KGET(pargv, faux_list_t *, pargs);
  21. kpargv_t *kpargv_new()
  22. {
  23. kpargv_t *pargv = NULL;
  24. pargv = faux_zmalloc(sizeof(*pargv));
  25. assert(pargv);
  26. if (!pargv)
  27. return NULL;
  28. // Parsed arguments list
  29. pargv->pargs = faux_list_new(FAUX_LIST_UNSORTED, FAUX_LIST_NONUNIQUE,
  30. NULL, NULL, (void (*)(void *))kparg_free);
  31. assert(pargv->pargs);
  32. return pargv;
  33. }
  34. void kpargv_free(kpargv_t *pargv)
  35. {
  36. if (!pargv)
  37. return;
  38. faux_list_free(pargv->pargs);
  39. free(pargv);
  40. }
  41. size_t kpargv_len(const kpargv_t *pargv)
  42. {
  43. assert(pargv);
  44. if (!pargv)
  45. return 0;
  46. return faux_list_len(pargv->pargs);
  47. }
  48. size_t kpargv_is_empty(const kpargv_t *pargv)
  49. {
  50. assert(pargv);
  51. if (!pargv)
  52. return 0;
  53. return faux_list_is_empty(pargv->pargs);
  54. }
  55. bool_t kpargv_add(kpargv_t *pargv, kparg_t *parg)
  56. {
  57. assert(pargv);
  58. assert(parg);
  59. if (!pargv)
  60. return BOOL_FALSE;
  61. if (!parg)
  62. return BOOL_FALSE;
  63. if (!faux_list_add(pargv->pargs, parg))
  64. return BOOL_FALSE;
  65. return BOOL_TRUE;
  66. }
  67. kparg_t *kpargv_last(const kpargv_t *pargv)
  68. {
  69. assert(pargv);
  70. if (!pargv)
  71. return NULL;
  72. if (kpargv_is_empty(pargv))
  73. return NULL;
  74. return (kparg_t *)faux_list_data(faux_list_tail(pargv->pargs));
  75. }