list.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. #include "__ofunc.h"
  2. ResultType tuple_list_newCore(OFFICAL_FUNCTIONSIG, enum ListType type){
  3. LinkValue *value = NULL;
  4. ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
  5. {.type=only_value, .must=0, .long_arg=true},
  6. {.must=-1}};
  7. setResultCore(result);
  8. parserArgumentUnion(ap, arg, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  9. if (!CHECK_RESULT(result))
  10. return result->type;
  11. freeResult(result);
  12. value = make_new(inter, belong, ap[0].value);
  13. value->value->type = list;
  14. value->value->data.list.type = type;
  15. value->value->data.list.list = NULL;
  16. value->value->data.list.size = 0;
  17. for (Argument *at = ap[1].arg; at != NULL && at->type == value_arg; at = at->next) {
  18. value->value->data.list.size++;
  19. value->value->data.list.list = memRealloc(value->value->data.list.list, value->value->data.list.size * sizeof(LinkValue *));
  20. value->value->data.list.list[value->value->data.list.size - 1] = at->data.value;
  21. }
  22. switch (init_new(value, NULL, "list.new", CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong))) {
  23. case 1:
  24. freeResult(result);
  25. setResultOperation(result, value);
  26. break;
  27. default:
  28. break;
  29. } // TODO-szh 提取成函数
  30. return result->type;
  31. }
  32. ResultType tuple_new(OFFICAL_FUNCTIONSIG) {
  33. return tuple_list_newCore(CALL_OFFICAL_FUNCTION(arg, var_list, result, belong), value_tuple);
  34. }
  35. ResultType list_new(OFFICAL_FUNCTIONSIG) {
  36. return tuple_list_newCore(CALL_OFFICAL_FUNCTION(arg, var_list, result, belong), value_list);
  37. }
  38. ResultType list_slice(OFFICAL_FUNCTIONSIG){
  39. ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
  40. {.type=only_value, .must=1, .long_arg=false},
  41. {.type=only_value, .must=0, .long_arg=false},
  42. {.type=only_value, .must=0, .long_arg=false},
  43. {.must=-1}};
  44. vnum size;
  45. vnum first;
  46. vnum second;
  47. vnum stride;
  48. setResultCore(result);
  49. parserArgumentUnion(ap, arg, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  50. if (!CHECK_RESULT(result))
  51. return result->type;
  52. freeResult(result);
  53. if (ap[0].value->value->type != list) {
  54. setResultError(E_TypeException, INSTANCE_ERROR(list), 0, "list", true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  55. return error_return;
  56. }
  57. size = ap[0].value->value->data.list.size;
  58. first = 0;
  59. second = size;
  60. stride = 1;
  61. for (vnum *list[]={&first, &second, &stride}, i=0; i < 3; i++) {
  62. if (ap[i + 1].value != NULL && ap[i + 1].value->value->type == number)
  63. *(list[i]) = ap[i + 1].value->value->data.num.num;
  64. else if (ap[i + 1].value != NULL && ap[i + 1].value->value->type != none) {
  65. setResultError(E_TypeException, ONLY_ACC(first/second/stride, number or none), 0, "list", true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  66. return error_return;
  67. }
  68. }
  69. if (!checkSlice(&first, &second, &stride, size, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong)))
  70. return result->type;
  71. {
  72. Argument *new_list = NULL;
  73. for (vnum i = stride > 0 ? first : second; stride > 0 ? (i < second) : (i > first); i += stride) {
  74. LinkValue *element = ap[0].value->value->data.list.list[i];
  75. new_list = connectValueArgument(element, new_list);
  76. }
  77. makeListValue(new_list, 0, "list.slice", value_list, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  78. freeArgument(new_list, true);
  79. }
  80. return result->type;
  81. }
  82. ResultType list_slice_assignment(OFFICAL_FUNCTIONSIG){
  83. ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
  84. {.type=only_value, .must=1, .long_arg=false},
  85. {.type=only_value, .must=1, .long_arg=false},
  86. {.type=only_value, .must=0, .long_arg=false},
  87. {.type=only_value, .must=0, .long_arg=false},
  88. {.must=-1}};
  89. vnum size;
  90. vnum first;
  91. vnum second;
  92. vnum stride;
  93. LinkValue *iter_obj = NULL;
  94. setResultCore(result);
  95. parserArgumentUnion(ap, arg, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  96. if (!CHECK_RESULT(result))
  97. return result->type;
  98. freeResult(result);
  99. if (ap[0].value->value->type != list) {
  100. setResultError(E_TypeException, INSTANCE_ERROR(list), 0, "sys", true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  101. return error_return;
  102. }
  103. size = ap[0].value->value->data.list.size;
  104. getIter(ap[1].value, 1, 0, "list", CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  105. if (!CHECK_RESULT(result))
  106. return result->type;
  107. iter_obj = result->value;
  108. result->value = NULL;
  109. freeResult(result);
  110. first = 0;
  111. second = size;
  112. stride = 1;
  113. for (vnum *list[]={&first, &second, &stride}, i=0; i < 3; i++) {
  114. if (ap[i + 2].value != NULL && ap[i + 2].value->value->type == number)
  115. *(list[i]) = ap[i + 2].value->value->data.num.num;
  116. else if (ap[i + 2].value != NULL && ap[i + 2].value->value->type != none) {
  117. setResultError(E_TypeException, ONLY_ACC(first/second/stride, num or null), 0, "list", true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  118. goto return_;
  119. }
  120. }
  121. if (!checkSlice(&first, &second, &stride, size, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong)))
  122. goto return_;
  123. {
  124. for (vnum i = stride > 0 ? first : second; stride > 0 ? (i < second) : (i > first); i += stride) {
  125. freeResult(result);
  126. getIter(iter_obj, 0, 0, "list", CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  127. if (is_iterStop(result->value, inter)){
  128. setResultError(E_TypeException, "Iter Object Too Short", 0, "list", true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  129. goto return_;
  130. }
  131. else if (!CHECK_RESULT(result))
  132. goto return_;
  133. ap[0].value->value->data.list.list[i] = result->value;
  134. }
  135. freeResult(result);
  136. getIter(iter_obj, 0, 0, "list", CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  137. if (CHECK_RESULT(result)) {
  138. setResultError(E_TypeException, "Iter Object Too Long", 0, "list", true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  139. goto return_;
  140. } else if (!is_iterStop(result->value, inter))
  141. goto return_;
  142. }
  143. setResult(result, inter, belong);
  144. return_:
  145. gc_freeTmpLink(&iter_obj->gc_status);
  146. return result->type;
  147. }
  148. ResultType list_slice_del(OFFICAL_FUNCTIONSIG){
  149. ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
  150. {.type=only_value, .must=1, .long_arg=false},
  151. {.type=only_value, .must=0, .long_arg=false},
  152. {.type=only_value, .must=0, .long_arg=false},
  153. {.must=-1}};
  154. vnum size;
  155. vnum first;
  156. vnum second;
  157. vnum stride;
  158. setResultCore(result);
  159. parserArgumentUnion(ap, arg, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  160. if (!CHECK_RESULT(result))
  161. return result->type;
  162. freeResult(result);
  163. if (ap[0].value->value->type != list) {
  164. setResultError(E_TypeException, INSTANCE_ERROR(list), 0, "list", true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  165. return error_return;
  166. }
  167. size = ap[0].value->value->data.list.size;
  168. first = 0;
  169. second = size;
  170. stride = 1;
  171. for (vnum *list[]={&first, &second, &stride}, i=0; i < 3; i++) {
  172. if (ap[i + 1].value != NULL && ap[i + 1].value->value->type == number)
  173. *(list[i]) = ap[i + 1].value->value->data.num.num;
  174. else if (ap[i + 1].value != NULL && ap[i + 1].value->value->type != none) {
  175. setResultError(E_TypeException, ONLY_ACC(first/second/stride, num or null), 0, "list", true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  176. return error_return;
  177. }
  178. }
  179. if (!checkSlice(&first, &second, &stride, size, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong)))
  180. return result->type;
  181. {
  182. LinkValue **new = NULL;
  183. vnum new_size = size;
  184. for (vnum i = stride > 0 ? first : second; stride > 0 ? (i < second) : (i > first); i += stride) {
  185. ap[0].value->value->data.list.list[i] = NULL;
  186. new_size --;
  187. }
  188. new = memCalloc(new_size, sizeof(LinkValue *));
  189. for (vnum i = 0, c = 0; i < size; i++) {
  190. if (ap[0].value->value->data.list.list[i] != NULL){
  191. new[c] = ap[0].value->value->data.list.list[i];
  192. c++;
  193. }
  194. }
  195. memFree(ap[0].value->value->data.list.list);
  196. ap[0].value->value->data.list.list = new;
  197. ap[0].value->value->data.list.size = new_size;
  198. }
  199. return result->type;
  200. }
  201. ResultType list_down_assignment(OFFICAL_FUNCTIONSIG){
  202. ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
  203. {.type=only_value, .must=1, .long_arg=false},
  204. {.type=only_value, .must=1, .long_arg=false},
  205. {.must=-1}};
  206. vnum size;
  207. vnum index;
  208. setResultCore(result);
  209. parserArgumentUnion(ap, arg, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  210. if (!CHECK_RESULT(result))
  211. return result->type;
  212. freeResult(result);
  213. if (ap[0].value->value->type != list){
  214. setResultError(E_TypeException, INSTANCE_ERROR(list), 0, "list", true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  215. return error_return;
  216. }
  217. if (ap[2].value->value->type != number){
  218. setResultError(E_TypeException, ONLY_ACC(list index, number), 0, "list", true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  219. return error_return;
  220. }
  221. size = ap[0].value->value->data.list.size;
  222. index = ap[2].value->value->data.num.num;
  223. if (index < 0)
  224. index = size + index;
  225. if (index >= size){
  226. setResultError(E_IndexException, "Index too max", 0, "list", true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  227. return error_return;
  228. } else if (index < 0){
  229. setResultError(E_IndexException, "Index less than 0", 0, "list", true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  230. return error_return;
  231. }
  232. ap[0].value->value->data.list.list[index] = ap[1].value;
  233. setResultOperationBase(result, ap[1].value);
  234. return result->type;
  235. }
  236. ResultType list_down_del(OFFICAL_FUNCTIONSIG){
  237. ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
  238. {.type=only_value, .must=1, .long_arg=false},
  239. {.must=-1}};
  240. vnum size;
  241. vnum index;
  242. setResultCore(result);
  243. parserArgumentUnion(ap, arg, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  244. if (!CHECK_RESULT(result))
  245. return result->type;
  246. freeResult(result);
  247. if (ap[0].value->value->type != list){
  248. setResultError(E_TypeException, INSTANCE_ERROR(list), 0, "list", true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  249. return error_return;
  250. }
  251. if (ap[1].value->value->type != number){
  252. setResultError(E_TypeException, ONLY_ACC(list index, number), 0, "list", true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  253. return error_return;
  254. }
  255. size = ap[0].value->value->data.list.size;
  256. index = ap[1].value->value->data.num.num;
  257. if (!checkIndex(&index, &size, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong)))
  258. return result->type;
  259. {
  260. LinkValue **new = NULL;
  261. new = memCalloc(size - 1, sizeof(LinkValue *));
  262. memcpy(new, ap[0].value->value->data.list.list, sizeof(LinkValue *) * index);
  263. memcpy(new + index, ap[0].value->value->data.list.list + index + 1, sizeof(LinkValue *) * (size - index - 1));
  264. memFree(ap[0].value->value->data.list.list);
  265. ap[0].value->value->data.list.list = new;
  266. ap[0].value->value->data.list.size --;
  267. }
  268. setResult(result, inter, belong);
  269. return result->type;
  270. }
  271. ResultType list_down(OFFICAL_FUNCTIONSIG){
  272. ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
  273. {.type=only_value, .must=1, .long_arg=false},
  274. {.must=-1}};
  275. vnum size;
  276. vnum index;
  277. LinkValue *element = NULL;
  278. setResultCore(result);
  279. parserArgumentUnion(ap, arg, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  280. if (!CHECK_RESULT(result))
  281. return result->type;
  282. freeResult(result);
  283. if (ap[0].value->value->type != list){
  284. setResultError(E_TypeException, INSTANCE_ERROR(list), 0, "list", true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  285. return error_return;
  286. }
  287. if (ap[1].value->value->type != number){
  288. setResultError(E_TypeException, ONLY_ACC(list index, number), 0, "list", true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  289. return error_return;
  290. }
  291. size = ap[0].value->value->data.list.size;
  292. index = ap[1].value->value->data.num.num;
  293. if (!checkIndex(&index, &size, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong)))
  294. return result->type;
  295. element = ap[0].value->value->data.list.list[index];
  296. setResultOperationBase(result, copyLinkValue(element, inter));
  297. return result->type;
  298. }
  299. ResultType list_iter(OFFICAL_FUNCTIONSIG){
  300. ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
  301. {.must=-1}};
  302. setResultCore(result);
  303. parserArgumentUnion(ap, arg, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  304. if (!CHECK_RESULT(result))
  305. return result->type;
  306. freeResult(result);
  307. if (ap[0].value->value->type != list){
  308. setResultError(E_TypeException, INSTANCE_ERROR(list), 0, "list", true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  309. return error_return;
  310. }
  311. {
  312. Argument *list_iter_arg = makeValueArgument(ap[0].value);
  313. callBackCore(inter->data.list_iter, list_iter_arg, 0, "list", 0,
  314. CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  315. freeArgument(list_iter_arg, true);
  316. }
  317. return result->type;
  318. }
  319. ResultType listRepoStrCore(OFFICAL_FUNCTIONSIG, bool is_repo){
  320. ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
  321. {.must=-1}};
  322. char *repo = NULL;
  323. Value *value = NULL;
  324. LinkValue *again = NULL;
  325. enum ListType lt;
  326. setResultCore(result);
  327. parserArgumentUnion(ap, arg, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  328. if (!CHECK_RESULT(result))
  329. return result->type;
  330. freeResult(result);
  331. value = ap[0].value->value;
  332. if (value->type != list){
  333. setResultError(E_TypeException, INSTANCE_ERROR(list), 0, "sys", true, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  334. return error_return;
  335. }
  336. lt = value->data.list.type;
  337. again = findAttributes(is_repo ? "repo_again" : "str_again", false, ap[0].value, inter);
  338. if (again != NULL){
  339. bool again_ = checkBool(again, 0, "sys", CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  340. if (!CHECK_RESULT(result))
  341. return result->type;
  342. if (again_) {
  343. makeStringValue(lt == value_list ? "[...]" : "(...)", 0, "list.repo", CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  344. return result->type;
  345. }
  346. }
  347. setBoolAttrible(true, is_repo ? "repo_again" : "str_again", 0, "list.repo", ap[0].value, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  348. if (lt == value_list)
  349. repo = memStrcpy("[");
  350. else
  351. repo = memStrcpy("(");
  352. for (int i=0;i < value->data.list.size;i++){
  353. char *tmp;
  354. freeResult(result);
  355. if (i > 0)
  356. repo = memStrcat(repo, ", ", true, false);
  357. tmp = getRepoStr(value->data.list.list[i], is_repo, 0, "sys", CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  358. if (!CHECK_RESULT(result))
  359. goto return_;
  360. repo = memStrcat(repo, tmp, true, false);
  361. }
  362. if (lt == value_list)
  363. repo = memStrcat(repo, "]", true, false);
  364. else
  365. repo = memStrcat(repo, ")", true, false);
  366. freeResult(result);
  367. makeStringValue(repo, 0, "list.repo", CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, result, belong));
  368. return_:
  369. {
  370. Result tmp;
  371. setResultCore(&tmp);
  372. setBoolAttrible(false, is_repo ? "repo_again" : "str_again", 0, "list.repo", ap[0].value, CALL_INTER_FUNCTIONSIG_NOT_ST(var_list, &tmp, belong));
  373. if (!RUN_TYPE(tmp.type)) {
  374. freeResult(result);
  375. *result = tmp;
  376. } else
  377. freeResult(&tmp);
  378. }
  379. memFree(repo);
  380. return result->type;
  381. }
  382. ResultType list_repo(OFFICAL_FUNCTIONSIG){
  383. return listRepoStrCore(CALL_OFFICAL_FUNCTION(arg, var_list, result, belong), true);
  384. }
  385. ResultType list_str(OFFICAL_FUNCTIONSIG){
  386. return listRepoStrCore(CALL_OFFICAL_FUNCTION(arg, var_list, result, belong), false);
  387. }
  388. void registeredList(REGISTERED_FUNCTIONSIG){
  389. {
  390. LinkValue *object = inter->data.tuple;
  391. NameFunc tmp[] = {{inter->data.object_new, tuple_new, class_free_},
  392. {inter->data.object_down, list_down, object_free_},
  393. {inter->data.object_slice, list_slice, object_free_},
  394. {inter->data.object_iter, list_iter, object_free_},
  395. {inter->data.object_repo, list_repo, object_free_},
  396. {inter->data.object_str, list_str, object_free_},
  397. {inter->data.object_down_del, list_down_del, object_free_},
  398. {inter->data.object_slice_del, list_slice_del, object_free_},
  399. {NULL, NULL}};
  400. gc_addTmpLink(&object->gc_status);
  401. addBaseClassVar("tuple", object, belong, inter);
  402. iterBaseClassFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
  403. gc_freeTmpLink(&object->gc_status);
  404. }
  405. {
  406. LinkValue *object = inter->data.list;
  407. NameFunc tmp[] = {{inter->data.object_new, list_new, class_free_},
  408. {inter->data.object_down_assignment, list_down_assignment, object_free_},
  409. {inter->data.object_slice_assignment, list_slice_assignment, object_free_},
  410. {NULL, NULL}};
  411. gc_addTmpLink(&object->gc_status);
  412. addBaseClassVar("list", object, belong, inter);
  413. iterBaseClassFunc(tmp, object, CALL_INTER_FUNCTIONSIG_CORE(inter->var_list));
  414. gc_freeTmpLink(&object->gc_status);
  415. }
  416. }
  417. void makeBaseList(Inter *inter){
  418. LinkValue *tuple = makeBaseChildClass4(inter->data.vobject, inter);
  419. LinkValue *list = makeBaseChildClass4(tuple, inter);
  420. gc_addStatementLink(&tuple->gc_status);
  421. gc_addStatementLink(&list->gc_status);
  422. inter->data.tuple = tuple;
  423. inter->data.list = list;
  424. }