kplugin.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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 <faux/conv.h>
  8. #include <faux/error.h>
  9. #include <klish/khelper.h>
  10. #include <klish/kplugin.h>
  11. struct kplugin_s {
  12. char *name;
  13. char *file;
  14. bool_t global;
  15. char *script;
  16. };
  17. // Simple methods
  18. // Name
  19. KGET_STR(plugin, name);
  20. KSET_STR_ONCE(plugin, name);
  21. // File
  22. KGET_STR(plugin, file);
  23. KSET_STR(plugin, file);
  24. // Global
  25. KGET_BOOL(plugin, global);
  26. KSET_BOOL(plugin, global);
  27. // Script
  28. KGET_STR(plugin, script);
  29. KSET_STR(plugin, script);
  30. static kplugin_t *kplugin_new_empty(void)
  31. {
  32. kplugin_t *plugin = NULL;
  33. plugin = faux_zmalloc(sizeof(*plugin));
  34. assert(plugin);
  35. if (!plugin)
  36. return NULL;
  37. // Initialize
  38. plugin->name = NULL;
  39. plugin->file = NULL;
  40. plugin->global = BOOL_FALSE;
  41. plugin->script = NULL;
  42. return plugin;
  43. }
  44. kplugin_t *kplugin_new(const iplugin_t *info, kplugin_error_e *error)
  45. {
  46. kplugin_t *plugin = NULL;
  47. plugin = kplugin_new_empty();
  48. assert(plugin);
  49. if (!plugin) {
  50. if (error)
  51. *error = KPLUGIN_ERROR_ALLOC;
  52. return NULL;
  53. }
  54. if (!info)
  55. return plugin;
  56. if (!kplugin_parse(plugin, info, error)) {
  57. kplugin_free(plugin);
  58. return NULL;
  59. }
  60. return plugin;
  61. }
  62. void kplugin_free(kplugin_t *plugin)
  63. {
  64. if (!plugin)
  65. return;
  66. faux_str_free(plugin->name);
  67. faux_str_free(plugin->file);
  68. faux_str_free(plugin->script);
  69. faux_free(plugin);
  70. }
  71. const char *kplugin_strerror(kplugin_error_e error)
  72. {
  73. const char *str = NULL;
  74. switch (error) {
  75. case KPLUGIN_ERROR_OK:
  76. str = "Ok";
  77. break;
  78. case KPLUGIN_ERROR_INTERNAL:
  79. str = "Internal error";
  80. break;
  81. case KPLUGIN_ERROR_ALLOC:
  82. str = "Memory allocation error";
  83. break;
  84. case KPLUGIN_ERROR_ATTR_NAME:
  85. str = "Illegal 'name' attribute";
  86. break;
  87. case KPLUGIN_ERROR_ATTR_FILE:
  88. str = "Illegal 'file' attribute";
  89. break;
  90. case KPLUGIN_ERROR_ATTR_GLOBAL:
  91. str = "Illegal 'global' attribute";
  92. break;
  93. case KPLUGIN_ERROR_SCRIPT:
  94. str = "Illegal script";
  95. break;
  96. default:
  97. str = "Unknown error";
  98. break;
  99. }
  100. return str;
  101. }
  102. bool_t kplugin_parse(kplugin_t *plugin, const iplugin_t *info, kplugin_error_e *error)
  103. {
  104. // Name [mandatory]
  105. if (faux_str_is_empty(info->name)) {
  106. if (error)
  107. *error = KPLUGIN_ERROR_ATTR_NAME;
  108. return BOOL_FALSE;
  109. } else {
  110. if (!kplugin_set_name(plugin, info->name)) {
  111. if (error)
  112. *error = KPLUGIN_ERROR_ATTR_NAME;
  113. return BOOL_FALSE;
  114. }
  115. }
  116. // File
  117. if (!faux_str_is_empty(info->file)) {
  118. if (!kplugin_set_file(plugin, info->file)) {
  119. if (error)
  120. *error = KPLUGIN_ERROR_ATTR_FILE;
  121. return BOOL_FALSE;
  122. }
  123. }
  124. // Global
  125. if (!faux_str_is_empty(info->global)) {
  126. bool_t b = BOOL_FALSE;
  127. if (!faux_conv_str2bool(info->global, &b) ||
  128. !kplugin_set_global(plugin, b)) {
  129. if (error)
  130. *error = KPLUGIN_ERROR_ATTR_GLOBAL;
  131. return BOOL_FALSE;
  132. }
  133. }
  134. // Script
  135. if (!faux_str_is_empty(info->script)) {
  136. if (!kplugin_set_script(plugin, info->script)) {
  137. if (error)
  138. *error = KPLUGIN_ERROR_SCRIPT;
  139. return BOOL_FALSE;
  140. }
  141. }
  142. return BOOL_TRUE;
  143. }
  144. kplugin_t *kplugin_from_iplugin(iplugin_t *iplugin, faux_error_t *error_stack)
  145. {
  146. kplugin_t *kplugin = NULL;
  147. kplugin_error_e kplugin_error = KPLUGIN_ERROR_OK;
  148. kplugin = kplugin_new(iplugin, &kplugin_error);
  149. if (!kplugin) {
  150. faux_error_sprintf(error_stack, "PLUGIN \"%s\": %s",
  151. iplugin->name ? iplugin->name : "(null)",
  152. kplugin_strerror(kplugin_error));
  153. return NULL;
  154. }
  155. return kplugin;
  156. }