/** * Assign queue element with an exist queue adaptor. */ void queue_assign(queue_t* pque_dest, const queue_t* cpque_src) { assert(pque_dest != NULL); assert(cpque_src != NULL); #ifdef CSTL_QUEUE_LIST_SEQUENCE list_assign(&pque_dest->_t_sequence, &cpque_src->_t_sequence); #else deque_assign(&pque_dest->_t_sequence, &cpque_src->_t_sequence); #endif }
/** * Assign stack element with an exist stack adaptor. */ void stack_assign(cstl_stack_t* psk_dest, const cstl_stack_t* cpsk_src) { assert(psk_dest != NULL); assert(cpsk_src != NULL); #if defined (CSTL_STACK_VECTOR_SEQUENCE) vector_assign(&psk_dest->_t_sequence, &cpsk_src->_t_sequence); #elif defined (CSTL_STACK_LIST_SEQUENCE) list_assign(&psk_dest->_t_sequence, &cpsk_src->_t_sequence); #else deque_assign(&psk_dest->_t_sequence, &cpsk_src->_t_sequence); #endif }
static int do_asgnindex(Var var, Var idx, Var expr, Var *ret) { ret->type = var.type; if (var.type == LIST) { if (idx.type != NUM) { var_free(idx); var_free(expr); raise(E_TYPE); return -1; } else if (idx.v.num <= 0 || idx.v.num > var.v.list->len) { var_free(expr); raise(E_RANGE); return -2; } else { ret->v.list = list_assign(var.v.list, expr, idx.v.num); return 0; } } else if (var.type == MAP) { ret->v.map = map_add(var.v.map, idx, expr); return 0; } else { var_free(expr); var_free(idx); raise(E_TYPE); return -3; } }
PRIVATE void list_horse(char **buf, struct comal_line *line) { if (!line) return; switch (line->cmd) { case 0: break; case runSYM: case delSYM: case chdirSYM: case rmdirSYM: case mkdirSYM: case osSYM: case dirSYM: case unitSYM: case select_outputSYM: case select_inputSYM: case returnSYM: case elifSYM: case traceSYM: case untilSYM: list_symsp(buf, line->cmd); list_exp(buf, line->lc.exp); break; case exitSYM: list_sym(buf, line->cmd); if (line->lc.exp) { list_char(buf, ' '); list_symsp(buf, whenSYM); list_exp(buf, line->lc.exp); } break; case stopSYM: list_sym(buf, line->cmd); if (line->lc.exp) { list_char(buf, ' '); list_exp(buf, line->lc.exp); } break; case elseSYM: case endSYM: case endcaseSYM: case endifSYM: case endloopSYM: case endwhileSYM: case otherwiseSYM: case loopSYM: case nullSYM: case retrySYM: case pageSYM: case handlerSYM: case endtrapSYM: list_sym(buf, line->cmd); break; case repeatSYM: list_repeat(buf, line); break; case trapSYM: list_sym(buf, line->cmd); if (line->lc.traprec.esc) { list_char(buf, ' '); list_sym(buf, escSYM); list_sym(buf, line->lc.traprec.esc); } break; case execSYM: if (show_exec) list_symsp(buf, execSYM); list_exp(buf, line->lc.exp); break; case caseSYM: list_symsp(buf, line->cmd); list_expsp(buf, line->lc.exp); list_sym(buf, ofSYM); break; case cursorSYM: list_symsp(buf, line->cmd); list_twoexp(buf, &line->lc.twoexp, ",", 1); break; case closeSYM: list_sym(buf, line->cmd); if (line->lc.exproot) { list_char(buf, ' '); list_symsp(buf, fileSYM); list_explist(buf, line->lc.exproot, 0); } break; case sysSYM: case dataSYM: list_symsp(buf, line->cmd); list_explist(buf, line->lc.exproot, 0); break; case localSYM: case dimSYM: list_dim(buf, line); break; case forSYM: list_for(buf, line); break; case funcSYM: case procSYM: list_pf(buf, line); break; case ifSYM: list_ifwhile(buf, thenSYM, line); break; case importSYM: list_import(buf, line); break; case inputSYM: list_input(buf, line); break; case openSYM: list_symsp(buf, line->cmd); list_symsp(buf, fileSYM); list_exp(buf, line->lc.openrec.filenum); list_text(buf, ", "); list_exp(buf, line->lc.openrec.filename); list_text(buf, ", "); list_symsp(buf, line->lc.openrec.type); if (line->lc.openrec.reclen) { list_exp(buf, line->lc.openrec.reclen); if (line->lc.openrec.read_only) { list_char(buf, ' '); list_sym(buf, read_onlySYM); } } break; case printSYM: list_print(buf, line); break; case readSYM: list_symsp(buf, line->cmd); if (line->lc.readrec.modifier) list_file(buf, line->lc.readrec.modifier); list_explist(buf, line->lc.readrec.lvalroot, 0); break; case endfuncSYM: case endprocSYM: list_sym(buf, line->cmd); if (line->lineptr) { list_char(buf, ' '); list_text(buf, line->lineptr->lc.pfrec.id->name); } break; case endforSYM: list_sym(buf, line->cmd); if (line->lineptr) { list_char(buf, ' '); list_exp(buf, line->lineptr->lc.forrec.lval); } break; case restoreSYM: list_sym(buf, line->cmd); if (line->lc.id) { list_char(buf, ' '); list_text(buf, line->lc.id->name); } break; case whenSYM: list_symsp(buf, line->cmd); list_whenlist(buf, line->lc.whenroot); break; case whileSYM: list_ifwhile(buf, doSYM, line); break; case writeSYM: list_symsp(buf, line->cmd); list_file(buf, &line->lc.writerec.twoexp); list_explist(buf, line->lc.writerec.exproot, 0); break; case becomesSYM: list_assign(buf, line); break; case idSYM: list_text(buf, line->lc.id->name); list_char(buf, ':'); break; default: list_text(buf, "<error: List default action>"); } }
void _type_copy_list(const void* cpv_first, const void* cpv_second, void* pv_output) { assert(cpv_first != NULL && cpv_second != NULL && pv_output != NULL); list_assign((list_t*)cpv_first, (list_t*)cpv_second); *(bool_t*)pv_output = true; }