uint8_t dht11_check_response(void) { uint8_t k; k = 150; while(DHT_READ) { _delay_us(2); k--; if( k < 1 ) { DPUTS("no start condition 1"); return 1; // time out } } k = 150; while(!DHT_READ) { _delay_us(2); k--; if( k < 1 ) { DPUTS("no start condition 2"); return 2; // time out } } return 0; }
/** Initialize minilink internal data. * \param stack_space Amount of stack space to reserve. */ void minilink_init(void) { char *tmpptr; init_freearea_base(); DPUTS("Scanning free ROM space..."); for (tmpptr = freerom_end - 1; tmpptr >= freerom_start; tmpptr--) { if (*tmpptr != (char) 0xff && *tmpptr != (char) 0x00) break; } freerom_start = (char*) ALIGN_WORD_NEXT((uintptr_t )tmpptr); DPUTS("Minilink init OK"); }
mod_export void makezleparams(int ro) { struct zleparam *zp; for(zp = zleparams; zp->name; zp++) { Param pm = createparam(zp->name, (zp->type |PM_SPECIAL|PM_REMOVABLE| PM_LOCAL|(ro ? PM_READONLY : 0))); if (!pm) pm = (Param) paramtab->getnode(paramtab, zp->name); DPUTS(!pm, "param not set in makezleparams"); pm->level = locallevel + 1; pm->u.data = zp->data; switch(PM_TYPE(zp->type)) { case PM_SCALAR: pm->gsu.s = zp->gsu; break; case PM_ARRAY: pm->gsu.a = (GsuArray)zp->gsu; break; case PM_INTEGER: pm->gsu.i = (GsuInteger)zp->gsu; pm->base = 10; break; } if ((zp->type & PM_UNSET) && (zmod.flags & MOD_MULT)) pm->node.flags &= ~PM_UNSET; } }
mod_export char * parse_subscript(char *s, int sub) { int l = strlen(s), err; char *t; if (!*s || *s == ']') return 0; lexsave(); untokenize(t = dupstring(s)); inpush(t, 0, NULL); strinbeg(0); len = 0; bptr = tokstr = s; bsiz = l + 1; err = dquote_parse(']', sub); if (err) { err = *bptr; *bptr = 0; untokenize(s); *bptr = err; s = 0; } else s = bptr; strinend(); inpop(); DPUTS(cmdsp, "BUG: parse_subscript: cmdstack not empty."); lexrestore(); return s; }
mod_export char * parse_subscript(char *s, int sub, int endchar) { int l = strlen(s), err; char *t; if (!*s || *s == endchar) return 0; zcontext_save(); untokenize(t = dupstring(s)); inpush(t, 0, NULL); strinbeg(0); lexbuf.len = 0; lexbuf.ptr = tokstr = s; lexbuf.siz = l + 1; err = dquote_parse(endchar, sub); if (err) { err = *lexbuf.ptr; *lexbuf.ptr = '\0'; untokenize(s); *lexbuf.ptr = err; s = NULL; } else { s = lexbuf.ptr; } strinend(); inpop(); DPUTS(cmdsp, "BUG: parse_subscript: cmdstack not empty."); zcontext_restore(); return s; }
static void addcompparams(struct compparam *cp, Param *pp) { for (; cp->name; cp++, pp++) { Param pm = createparam(cp->name, cp->type |PM_SPECIAL|PM_REMOVABLE|PM_LOCAL); if (!pm) pm = (Param) paramtab->getnode(paramtab, cp->name); DPUTS(!pm, "param not set in addcompparams"); *pp = pm; pm->level = locallevel + 1; if ((pm->u.data = cp->var)) { switch(PM_TYPE(cp->type)) { case PM_SCALAR: pm->gsu.s = &compvarscalar_gsu; break; case PM_INTEGER: pm->gsu.i = &compvarinteger_gsu; pm->base = 10; break; case PM_ARRAY: pm->gsu.a = &compvararray_gsu; break; } } else { pm->gsu.s = cp->gsu; } } }
static void dec_tindent(void) { DPUTS(tindent == 0, "attempting to decrement tindent below zero"); if (tindent > 0) tindent--; }
static void setpmmapfiles(Param pm, HashTable ht) { int i; HashNode hn; /* just to see if I've understood what's happening */ DPUTS(pm != mapfile_pm, "BUG: setpmmapfiles called for wrong param"); if (!ht) return; if (!(pm->flags & PM_READONLY)) for (i = 0; i < ht->hsize; i++) for (hn = ht->nodes[i]; hn; hn = hn->next) { struct value v; v.isarr = v.inv = v.start = 0; v.end = -1; v.arr = NULL; v.pm = (Param) hn; setpmmapfile(v.pm, ztrdup(getstrvalue(&v))); } deleteparamtable(ht); }
static mnumber setmathvar(struct mathvalue *mvp, mnumber v) { if (mvp->pval) { /* * This value may have been hanging around for a while. * Be ultra-paranoid in checking the variable is still valid. */ char *s = mvp->lval, *ptr; Param pm; DPUTS(!mvp->lval, "no variable name but variable value in math"); if ((ptr = strchr(s, '['))) s = dupstrpfx(s, ptr - s); pm = (Param) paramtab->getnode(paramtab, s); if (pm == mvp->pval->pm) { if (noeval) return v; setnumvalue(mvp->pval, v); return v; } /* Different parameter, start again from scratch */ mvp->pval = NULL; } if (!mvp->lval) { zerr("lvalue required"); v.type = MN_INTEGER; v.u.l = 0; return v; } if (noeval) return v; untokenize(mvp->lval); setnparam(mvp->lval, v); return v; }
mod_export char * parse_subscript(char *s, int sub, int endchar) { int l = strlen(s), err, toklen; char *t; if (!*s || *s == endchar) return 0; zcontext_save(); untokenize(t = dupstring(s)); inpush(t, 0, NULL); strinbeg(0); /* * Warning to Future Generations: * * This way of passing the subscript through the lexer is brittle. * Code above this for several layers assumes that when we tokenise * the input it goes into the same place as the original string. * However, the lexer may overwrite later bits of the string or * reallocate it, in particular when expanding aliaes. To get * around this, we copy the string and then copy it back. This is a * bit more robust but still relies on the underlying assumption of * length preservation. */ lexbuf.len = 0; lexbuf.ptr = tokstr = dupstring(s); lexbuf.siz = l + 1; err = dquote_parse(endchar, sub); toklen = (int)(lexbuf.ptr - tokstr); DPUTS(toklen > l, "Bad length for parsed subscript"); memcpy(s, tokstr, toklen); if (err) { char *strend = s + toklen; err = *strend; *strend = '\0'; untokenize(s); *strend = err; s = NULL; } else { s += toklen; } strinend(); inpop(); DPUTS(cmdsp, "BUG: parse_subscript: cmdstack not empty."); zcontext_restore(); return s; }
void cmdpop(void) { if (cmdsp <= 0) { DPUTS(1, "BUG: cmdstack empty"); fflush(stderr); } else cmdsp--; }
mod_export void lexrestore(void) { struct lexstack *ln; DPUTS(!lstack, "BUG: lexrestore() without lexsave()"); incmdpos = lstack->incmdpos; incond = lstack->incond; incasepat = lstack->incasepat; dbparens = lstack->dbparens; isfirstln = lstack->isfirstln; isfirstch = lstack->isfirstch; histactive = lstack->histactive; histdone = lstack->histdone; stophist = lstack->stophist; chline = lstack->hline; hptr = lstack->hptr; if (cmdstack) free(cmdstack); cmdstack = lstack->cstack; cmdsp = lstack->csp; tok = lstack->tok; isnewlin = lstack->isnewlin; tokstr = lstack->tokstr; yytext = lstack->yytext; bptr = lstack->bptr; bsiz = lstack->bsiz; len = lstack->len; chwords = lstack->chwords; chwordlen = lstack->chwordlen; chwordpos = lstack->chwordpos; hwgetword = lstack->hwgetword; lexstop = lstack->lexstop; hdocs = lstack->hdocs; hgetc = lstack->hgetc; hungetc = lstack->hungetc; hwaddc = lstack->hwaddc; hwbegin = lstack->hwbegin; hwend = lstack->hwend; addtoline = lstack->addtoline; if (ecbuf) zfree(ecbuf, eclen); eclen = lstack->eclen; ecused = lstack->ecused; ecnpats = lstack->ecnpats; ecbuf = lstack->ecbuf; ecstrs = lstack->ecstrs; ecsoffs = lstack->ecsoffs; ecssub = lstack->ecssub; ecnfunc = lstack->ecnfunc; hlinesz = lstack->hlinesz; errflag = 0; ln = lstack->next; free(lstack); lstack = ln; }
/***************************************************************************** DISCRIPTION : ELFãƒãƒ¼ãƒ‰ ARGUMENT : pElfHead = ELFæ§‹é€ ä½“ RETURN : 0 = æ£å¸¸çµ‚了 : 0以外 = 異常終了 NOTE : - UPDATED : 2013-09-03 *****************************************************************************/ char* elfLoad(char* pcBuf) { ELF_HEAD* pElfHead = (ELF_HEAD*)pcBuf; int16 iRet; if((iRet = elfCheck(pElfHead)) < 0){ DPUTS((uint08*)"elfCheck() error!! > "); DPHEX(iRet, 8, 1); DPUTS((uint08*)"\n"); return NULL; } if((iRet = elfLoadProgram(pElfHead)) < 0){ DPUTS((uint08*)"elfLoadProgram() error!!\n"); DPHEX(iRet, 8, 1); DPUTS((uint08*)"\n"); return NULL; } return (char*)pElfHead->lEntryPoint; }
mgasptr_t mgas_all_alloc(size_t size) { DPUTS("This function is deprecated. Use mgas_all_dmalloc()."); size_t n_dims = 1; size_t block_size[] = { 4096 }; size_t n_blocks[] = { (size + block_size[0] - 1) / block_size[0] }; return mgas_all_dmalloc(size, n_dims, block_size, n_blocks); }
static void checksched(void) { time_t t; struct schedcmd *sch; if(!schedcmds) return; t = time(NULL); /* * List is ordered, so we only need to consider the * head element. */ while (schedcmds && schedcmds->time <= t) { /* * Remove the entry to be executed from the list * before execution: this makes quite sure that * the entry hasn't been monkeyed with when we * free it. */ sch = schedcmds; schedcmds = sch->next; /* * Delete from the timed function list now in case * the called code reschedules. */ scheddeltimed(); if ((sch->flags & SCHEDFLAG_TRASH_ZLE) && zleactive) zleentry(ZLE_CMD_TRASH); execstring(sch->cmd, 0, 0, "sched"); zsfree(sch->cmd); zfree(sch, sizeof(struct schedcmd)); /* * Fix time for future events. * I had this outside the loop, for a little extra efficiency. * However, it then occurred to me that having the list of * forthcoming entries up to date could be regarded as * a feature, and the inefficiency is negligible. * * Careful in case the code we called has already set * up a timed event; if it has, that'll be up to date since * we haven't changed the list here. */ if (schedcmds && !schedcmdtimed) { /* * We've already delete the function from the list. */ DPUTS(timedfns && firstnode(timedfns), "BUG: already timed fn (1)"); schedaddtimed(schedcmds->time); } } }
mod_export void free_colour_buffer(void) { if (--colseq_buf_allocs) return; DPUTS(!colseq_buf, "Freeing colour sequence buffer without alloc"); /* Free buffer for colour code composition */ free(colseq_buf); colseq_buf = NULL; }
/** Get the filename from which the given process was loaded from. * * \param process Pointer to the process structure. * \return NULL if program not loaded by minilink, or a string containing * the file name. */ const char * minilink_get_filename(struct process *process) { Minilink_ProgramInfoHeader *instprog = instprog_next(NULL); DPUTS("Searching program in Ram..."); for (;;) { if (instprog == NULL) break; if ( (uintptr_t) (void*) process >= (uintptr_t) instprog->mem[MINILINK_DATA].ptr && (uintptr_t) (void*) process < (uintptr_t) instprog->mem[MINILINK_DATA].ptr + instprog->mem[MINILINK_DATA].size) { DPRINTF("Found %s\n", instprog->sourcefile); return instprog->sourcefile; } instprog = instprog_next(instprog); } DPUTS("Not found."); return NULL; }
void loop(int toplevel) { List list; #ifdef DEBUG int oasp = toplevel ? 0 : alloc_stackp; #endif pushheap(); for (;;) { freeheap(); errflag = 0; if (interact && isset(SHINSTDIN)) preprompt(); hbegin(); /* init history mech */ intr(); /* interrupts on */ lexinit(); /* initialize lexical state */ if (!(list = parse_event())) { /* if we couldn't parse a list */ hend(); if (tok == ENDINPUT && !errflag) break; continue; } if (hend()) { int toksav = tok; if (stopmsg) /* unset 'you have stopped jobs' flag */ stopmsg--; execlist(list, 0, 0); tok = toksav; if (toplevel) noexitct = 0; } DPUTS(alloc_stackp != oasp, "BUG: alloc_stackp changed in loop()"); if (ferror(stderr)) { zerr("write error", NULL, 0); clearerr(stderr); } if (subsh) /* how'd we get this far in a subshell? */ exit(lastval); if (((!interact || sourcelevel) && errflag) || retflag) break; if (trapreturn) { lastval = trapreturn; trapreturn = 0; } if (isset(SINGLECOMMAND) && toplevel) { if (sigtrapped[SIGEXIT]) dotrap(SIGEXIT); exit(lastval); } } popheap(); }
void singsub(char **s) { LinkList foo; foo = newlinklist(); addlinknode(foo, *s); prefork(foo, 4); if (errflag) return; *s = (char *) ugetnode(foo); DPUTS(nonempty(foo), "BUG: singsub() produced more than one word!"); }
/** Check if given program was already linked into rom area. * * \param proginfo Information structure of the program to find. * \return NULL if program not found, or a pointer to the metadata * in case a matching header was found. * \todo Check whether the file is installed */ static Minilink_ProgramInfoHeader* program_already_loaded(Minilink_ProgramInfoHeader *proginfo) { Minilink_ProgramInfoHeader *instprog = instprog_next(NULL); DPUTS("Searching program..."); for (;;) { if (instprog == NULL) break; if (proginfo->crc == instprog->crc && proginfo->mem[MINILINK_TEXT].size == instprog->mem[MINILINK_TEXT].size && !strncmp(proginfo->sourcefile, instprog->sourcefile, MINILINK_MAX_FILENAME)) { DPUTS("Found!"); return instprog; } instprog = instprog_next(instprog); } DPUTS("Not found."); return NULL; }
mod_export void old_heaps(Heap old) { Heap h, n; queue_signals(); for (h = heaps; h; h = n) { n = h->next; DPUTS(h->sp, "BUG: old_heaps() with pushed heaps"); #ifdef ZSH_HEAP_DEBUG if (heap_debug_verbosity & HDV_FREE) { fprintf(stderr, "HEAP DEBUG: heap " HEAPID_FMT "freed in old_heaps().\n", h->heap_id); } #endif #ifdef USE_MMAP munmap((void *) h, h->size); #else zfree(h, HEAPSIZE); #endif #ifdef ZSH_VALGRIND VALGRIND_DESTROY_MEMPOOL((char *)h); #endif } heaps = old; #ifdef ZSH_HEAP_DEBUG if (heap_debug_verbosity & HDV_OLD) { fprintf(stderr, "HEAP DEBUG: heap " HEAPID_FMT "restored.\n", heaps->heap_id); } { Heap myold = heaps_saved ? getlinknode(heaps_saved) : NULL; if (old != myold) { fprintf(stderr, "HEAP DEBUG: invalid old heap " HEAPID_FMT ", expecting " HEAPID_FMT ".\n", old->heap_id, myold->heap_id); } } #endif fheap = NULL; unqueue_signals(); }
mod_export void backdel(int ct, int flags) { if (flags & CUT_RAW) { if (zlemetaline != NULL) { shiftchars(zlemetacs -= ct, ct); } else { shiftchars(zlecs -= ct, ct); CCRIGHT(); } } else { int n = ct, origcs = zlecs; DPUTS(zlemetaline != NULL, "backdel needs CUT_RAW when metafied"); while (n--) DECCS(); shiftchars(zlecs, origcs - zlecs); CCRIGHT(); } }
mod_export int parsestrnoerr(char *s) { int l = strlen(s), err; lexsave(); untokenize(s); inpush(dupstring(s), 0, NULL); strinbeg(0); len = 0; bptr = tokstr = s; bsiz = l + 1; err = dquote_parse('\0', 1); *bptr = '\0'; strinend(); inpop(); DPUTS(cmdsp, "BUG: parsestr: cmdstack not empty."); lexrestore(); return err; }
void makecompparams(void) { Param cpm; HashTable tht; addcompparams(comprparams, comprpms); if (!(cpm = createparam(COMPSTATENAME, PM_SPECIAL|PM_REMOVABLE|PM_LOCAL|PM_HASHED))) cpm = (Param) paramtab->getnode(paramtab, COMPSTATENAME); DPUTS(!cpm, "param not set in makecompparams"); comprpms[CPN_COMPSTATE] = cpm; tht = paramtab; cpm->level = locallevel + 1; cpm->gsu.h = &compstate_gsu; cpm->u.hash = paramtab = newparamtable(31, COMPSTATENAME); addcompparams(compkparams, compkpms); paramtab = tht; }
mod_export int parse_subst_string(char *s) { int c, l = strlen(s), err, olen, lexstop_ret; if (!*s || !strcmp(s, nulstring)) return 0; lexsave(); untokenize(s); inpush(dupstring(s), 0, NULL); strinbeg(0); len = 0; bptr = tokstr = s; bsiz = l + 1; c = hgetc(); lexstop_ret = lexstop; c = gettokstr(c, 1); err = errflag; strinend(); inpop(); DPUTS(cmdsp, "BUG: parse_subst_string: cmdstack not empty."); olen = len; lexrestore(); errflag = err; if (c == LEXERR) { untokenize(s); return 1; } #ifdef DEBUG if (c != STRING || olen != l || errflag) { fprintf(stderr, "Oops. Bug in parse_subst_string: %s\n", olen < l ? "len < l" : errflag ? "errflag" : "c != STRING"); fflush(stderr); untokenize(s); return 1; } #endif return 0; }
mod_export int parsestrnoerr(char **s) { int l = strlen(*s), err; zcontext_save(); untokenize(*s); inpush(dupstring(*s), 0, NULL); strinbeg(0); lexbuf.len = 0; lexbuf.ptr = tokstr = *s; lexbuf.siz = l + 1; err = dquote_parse('\0', 1); if (tokstr) *s = tokstr; *lexbuf.ptr = '\0'; strinend(); inpop(); DPUTS(cmdsp, "BUG: parsestr: cmdstack not empty."); zcontext_restore(); return err; }
mod_export void foredel(int ct, int flags) { if (flags & CUT_RAW) { if (zlemetaline != NULL) { shiftchars(zlemetacs, ct); } else if (flags & CUT_RAW) { shiftchars(zlecs, ct); CCRIGHT(); } } else { int origcs = zlecs; int n = ct; DPUTS(zlemetaline != NULL, "foredel needs CUT_RAW when metafied"); while (n--) INCCS(); ct = zlecs - origcs; zlecs = origcs; shiftchars(zlecs, ct); CCRIGHT(); } }
void getredirs(LinkList redirs) { LinkNode n; static char *fstr[] = { ">", ">|", ">>", ">>|", "&>", "&>|", "&>>", "&>>|", "<>", "<", "<<", "<<-", "<<<", "<&", ">&", NULL /* >&- */, "<", ">" }; taddchr(' '); for (n = firstnode(redirs); n; incnode(n)) { Redir f = (Redir) getdata(n); switch (f->type) { case REDIR_WRITE: case REDIR_WRITENOW: case REDIR_APP: case REDIR_APPNOW: case REDIR_ERRWRITE: case REDIR_ERRWRITENOW: case REDIR_ERRAPP: case REDIR_ERRAPPNOW: case REDIR_READ: case REDIR_READWRITE: case REDIR_HERESTR: case REDIR_MERGEIN: case REDIR_MERGEOUT: case REDIR_INPIPE: case REDIR_OUTPIPE: if (f->varid) { taddchr('{'); taddstr(f->varid); taddchr('}'); } else if (f->fd1 != (IS_READFD(f->type) ? 0 : 1)) taddchr('0' + f->fd1); if (f->type == REDIR_HERESTR && (f->flags & REDIRF_FROM_HEREDOC)) { if (tnewlins) { /* * Strings that came from here-documents are converted * to here strings without quotation, so convert them * back. */ taddstr(fstr[REDIR_HEREDOC]); taddstr(f->here_terminator); taddpending(f->name, f->munged_here_terminator); } else { int fnamelen, sav; taddstr(fstr[REDIR_HERESTR]); /* * Just a quick and dirty representation. * Remove a terminating newline, if any. */ fnamelen = strlen(f->name); if (fnamelen > 0 && f->name[fnamelen-1] == '\n') { sav = 1; f->name[fnamelen-1] = '\0'; } else sav = 0; /* * Strings that came from here-documents are converted * to here strings without quotation, so add that * now. If tokens are present we need to do double quoting. */ if (!has_token(f->name)) { taddchr('\''); taddstr(quotestring(f->name, NULL, QT_SINGLE)); taddchr('\''); } else { taddchr('"'); taddstr(quotestring(f->name, NULL, QT_DOUBLE)); taddchr('"'); } if (sav) f->name[fnamelen-1] = '\n'; } } else { taddstr(fstr[f->type]); if (f->type != REDIR_MERGEIN && f->type != REDIR_MERGEOUT) taddchr(' '); taddstr(f->name); } taddchr(' '); break; #ifdef DEBUG case REDIR_CLOSE: DPUTS(1, "BUG: CLOSE in getredirs()"); taddchr(f->fd1 + '0'); taddstr(">&- "); break; default: DPUTS(1, "BUG: unknown redirection in getredirs()"); #endif } } tptr--; }
static void gettext2(Estate state) { Tstack s, n; int stack = 0; wordcode code; while (1) { if (stack) { if (!(s = tstack)) break; if (s->pop) { tstack = s->prev; s->prev = tfree; tfree = s; } code = s->code; stack = 0; } else { s = NULL; code = *state->pc++; } switch (wc_code(code)) { case WC_LIST: if (!s) { s = tpush(code, (WC_LIST_TYPE(code) & Z_END)); stack = 0; } else { if (WC_LIST_TYPE(code) & Z_ASYNC) { taddstr(" &"); if (WC_LIST_TYPE(code) & Z_DISOWN) taddstr("|"); } if (!(stack = (WC_LIST_TYPE(code) & Z_END))) { if (tnewlins) taddnl(0); else taddstr((WC_LIST_TYPE(code) & Z_ASYNC) ? " " : "; "); s->code = *state->pc++; s->pop = (WC_LIST_TYPE(s->code) & Z_END); } } if (!stack && (WC_LIST_TYPE(s->code) & Z_SIMPLE)) state->pc++; break; case WC_SUBLIST: if (!s) { if (!(WC_SUBLIST_FLAGS(code) & WC_SUBLIST_SIMPLE) && wc_code(*state->pc) != WC_PIPE) stack = -1; if (WC_SUBLIST_FLAGS(code) & WC_SUBLIST_NOT) taddstr(stack ? "!" : "! "); if (WC_SUBLIST_FLAGS(code) & WC_SUBLIST_COPROC) taddstr(stack ? "coproc" : "coproc "); s = tpush(code, (WC_SUBLIST_TYPE(code) == WC_SUBLIST_END)); } else { if (!(stack = (WC_SUBLIST_TYPE(code) == WC_SUBLIST_END))) { taddstr((WC_SUBLIST_TYPE(code) == WC_SUBLIST_OR) ? " || " : " && "); s->code = *state->pc++; s->pop = (WC_SUBLIST_TYPE(s->code) == WC_SUBLIST_END); if (WC_SUBLIST_FLAGS(s->code) & WC_SUBLIST_NOT) taddstr("! "); if (WC_SUBLIST_FLAGS(s->code) & WC_SUBLIST_COPROC) taddstr("coproc "); } } if (stack < 1 && (WC_SUBLIST_FLAGS(s->code) & WC_SUBLIST_SIMPLE)) state->pc++; break; case WC_PIPE: if (!s) { tpush(code, (WC_PIPE_TYPE(code) == WC_PIPE_END)); if (WC_PIPE_TYPE(code) == WC_PIPE_MID) state->pc++; } else { if (!(stack = (WC_PIPE_TYPE(code) == WC_PIPE_END))) { taddstr(" | "); s->code = *state->pc++; if (!(s->pop = (WC_PIPE_TYPE(s->code) == WC_PIPE_END))) state->pc++; } } break; case WC_REDIR: if (!s) { state->pc--; n = tpush(code, 1); n->u._redir.list = ecgetredirs(state); } else { getredirs(s->u._redir.list); stack = 1; } break; case WC_ASSIGN: taddstr(ecgetstr(state, EC_NODUP, NULL)); if (WC_ASSIGN_TYPE2(code) == WC_ASSIGN_INC) taddchr('+'); taddchr('='); if (WC_ASSIGN_TYPE(code) == WC_ASSIGN_ARRAY) { taddchr('('); taddlist(state, WC_ASSIGN_NUM(code)); taddstr(") "); } else { taddstr(ecgetstr(state, EC_NODUP, NULL)); taddchr(' '); } break; case WC_SIMPLE: taddlist(state, WC_SIMPLE_ARGC(code)); stack = 1; break; case WC_SUBSH: if (!s) { taddstr("("); tindent++; taddnl(1); n = tpush(code, 1); n->u._subsh.end = state->pc + WC_SUBSH_SKIP(code); /* skip word only use for try/always */ state->pc++; } else { state->pc = s->u._subsh.end; dec_tindent(); /* semicolon is optional here but more standard */ taddnl(0); taddstr(")"); stack = 1; } break; case WC_CURSH: if (!s) { taddstr("{"); tindent++; taddnl(1); n = tpush(code, 1); n->u._subsh.end = state->pc + WC_CURSH_SKIP(code); /* skip word only use for try/always */ state->pc++; } else { state->pc = s->u._subsh.end; dec_tindent(); /* semicolon is optional here but more standard */ taddnl(0); taddstr("}"); stack = 1; } break; case WC_TIMED: if (!s) { taddstr("time"); if (WC_TIMED_TYPE(code) == WC_TIMED_PIPE) { taddchr(' '); tindent++; tpush(code, 1); } else stack = 1; } else { dec_tindent(); stack = 1; } break; case WC_FUNCDEF: if (!s) { Wordcode p = state->pc; Wordcode end = p + WC_FUNCDEF_SKIP(code); taddlist(state, *state->pc++); if (tjob) { taddstr(" () { ... }"); state->pc = end; stack = 1; } else { taddstr(" () {"); tindent++; taddnl(1); n = tpush(code, 1); n->u._funcdef.strs = state->strs; n->u._funcdef.end = end; state->strs += *state->pc; state->pc += 3; } } else { state->strs = s->u._funcdef.strs; state->pc = s->u._funcdef.end; dec_tindent(); taddnl(0); taddstr("}"); stack = 1; } break; case WC_FOR: if (!s) { taddstr("for "); if (WC_FOR_TYPE(code) == WC_FOR_COND) { taddstr("(("); taddstr(ecgetstr(state, EC_NODUP, NULL)); taddstr("; "); taddstr(ecgetstr(state, EC_NODUP, NULL)); taddstr("; "); taddstr(ecgetstr(state, EC_NODUP, NULL)); taddstr(")) do"); } else { taddlist(state, *state->pc++); if (WC_FOR_TYPE(code) == WC_FOR_LIST) { taddstr(" in "); taddlist(state, *state->pc++); } taddnl(0); taddstr("do"); } tindent++; taddnl(0); tpush(code, 1); } else { dec_tindent(); taddnl(0); taddstr("done"); stack = 1; } break; case WC_SELECT: if (!s) { taddstr("select "); taddstr(ecgetstr(state, EC_NODUP, NULL)); if (WC_SELECT_TYPE(code) == WC_SELECT_LIST) { taddstr(" in "); taddlist(state, *state->pc++); } tindent++; taddnl(0); tpush(code, 1); } else { dec_tindent(); taddnl(0); taddstr("done"); stack = 1; } break; case WC_WHILE: if (!s) { taddstr(WC_WHILE_TYPE(code) == WC_WHILE_UNTIL ? "until " : "while "); tindent++; tpush(code, 0); } else if (!s->pop) { dec_tindent(); taddnl(0); taddstr("do"); tindent++; taddnl(0); s->pop = 1; } else { dec_tindent(); taddnl(0); taddstr("done"); stack = 1; } break; case WC_REPEAT: if (!s) { taddstr("repeat "); taddstr(ecgetstr(state, EC_NODUP, NULL)); taddnl(0); taddstr("do"); tindent++; taddnl(0); tpush(code, 1); } else { dec_tindent(); taddnl(0); taddstr("done"); stack = 1; } break; case WC_CASE: if (!s) { Wordcode end = state->pc + WC_CASE_SKIP(code); taddstr("case "); taddstr(ecgetstr(state, EC_NODUP, NULL)); taddstr(" in"); if (state->pc >= end) { if (tnewlins) taddnl(0); else taddchr(' '); taddstr("esac"); stack = 1; } else { tindent++; if (tnewlins) taddnl(0); else taddchr(' '); taddstr("("); code = *state->pc++; taddstr(ecgetstr(state, EC_NODUP, NULL)); state->pc++; taddstr(") "); tindent++; n = tpush(code, 0); n->u._case.end = end; n->pop = (state->pc - 2 + WC_CASE_SKIP(code) >= end); } } else if (state->pc < s->u._case.end) { dec_tindent(); switch (WC_CASE_TYPE(code)) { case WC_CASE_OR: taddstr(" ;;"); break; case WC_CASE_AND: taddstr(";&"); break; default: taddstr(";|"); break; } if (tnewlins) taddnl(0); else taddchr(' '); taddstr("("); code = *state->pc++; taddstr(ecgetstr(state, EC_NODUP, NULL)); state->pc++; taddstr(") "); tindent++; s->code = code; s->pop = ((state->pc - 2 + WC_CASE_SKIP(code)) >= s->u._case.end); } else { dec_tindent(); switch (WC_CASE_TYPE(code)) { case WC_CASE_OR: taddstr(" ;;"); break; case WC_CASE_AND: taddstr(";&"); break; default: taddstr(";|"); break; } dec_tindent(); if (tnewlins) taddnl(0); else taddchr(' '); taddstr("esac"); stack = 1; } break; case WC_IF: if (!s) { Wordcode end = state->pc + WC_IF_SKIP(code); taddstr("if "); tindent++; state->pc++; n = tpush(code, 0); n->u._if.end = end; n->u._if.cond = 1; } else if (s->pop) { stack = 1; } else if (s->u._if.cond) { dec_tindent(); taddnl(0); taddstr("then"); tindent++; taddnl(0); s->u._if.cond = 0; } else if (state->pc < s->u._if.end) { dec_tindent(); taddnl(0); code = *state->pc++; if (WC_IF_TYPE(code) == WC_IF_ELIF) { taddstr("elif "); tindent++; s->u._if.cond = 1; } else { taddstr("else"); tindent++; taddnl(0); } } else { s->pop = 1; dec_tindent(); taddnl(0); taddstr("fi"); stack = 1; } break; case WC_COND: { static char *c1[] = { "=", "!=", "<", ">", "-nt", "-ot", "-ef", "-eq", "-ne", "-lt", "-gt", "-le", "-ge", "=~" }; int ctype; if (!s) { taddstr("[[ "); n = tpush(code, 1); n->u._cond.par = 2; } else if (s->u._cond.par == 2) { taddstr(" ]]"); stack = 1; break; } else if (s->u._cond.par == 1) { taddstr(" )"); stack = 1; break; } else if (WC_COND_TYPE(s->code) == COND_AND) { taddstr(" && "); code = *state->pc++; if (WC_COND_TYPE(code) == COND_OR) { taddstr("( "); n = tpush(code, 1); n->u._cond.par = 1; } } else if (WC_COND_TYPE(s->code) == COND_OR) { taddstr(" || "); code = *state->pc++; if (WC_COND_TYPE(code) == COND_AND) { taddstr("( "); n = tpush(code, 1); n->u._cond.par = 1; } } while (!stack) { switch ((ctype = WC_COND_TYPE(code))) { case COND_NOT: taddstr("! "); code = *state->pc++; if (WC_COND_TYPE(code) <= COND_OR) { taddstr("( "); n = tpush(code, 1); n->u._cond.par = 1; } break; case COND_AND: n = tpush(code, 1); n->u._cond.par = 0; code = *state->pc++; if (WC_COND_TYPE(code) == COND_OR) { taddstr("( "); n = tpush(code, 1); n->u._cond.par = 1; } break; case COND_OR: n = tpush(code, 1); n->u._cond.par = 0; code = *state->pc++; if (WC_COND_TYPE(code) == COND_AND) { taddstr("( "); n = tpush(code, 1); n->u._cond.par = 1; } break; case COND_MOD: taddstr(ecgetstr(state, EC_NODUP, NULL)); taddchr(' '); taddlist(state, WC_COND_SKIP(code)); stack = 1; break; case COND_MODI: { char *name = ecgetstr(state, EC_NODUP, NULL); taddstr(ecgetstr(state, EC_NODUP, NULL)); taddchr(' '); taddstr(name); taddchr(' '); taddstr(ecgetstr(state, EC_NODUP, NULL)); stack = 1; } break; default: if (ctype < COND_MOD) { /* Binary test: `a = b' etc. */ taddstr(ecgetstr(state, EC_NODUP, NULL)); taddstr(" "); taddstr(c1[ctype - COND_STREQ]); taddstr(" "); taddstr(ecgetstr(state, EC_NODUP, NULL)); if (ctype == COND_STREQ || ctype == COND_STRNEQ) state->pc++; } else { /* Unary test: `-f foo' etc. */ char c2[4]; c2[0] = '-'; c2[1] = ctype; c2[2] = ' '; c2[3] = '\0'; taddstr(c2); taddstr(ecgetstr(state, EC_NODUP, NULL)); } stack = 1; break; } } } break; case WC_ARITH: taddstr("(("); taddstr(ecgetstr(state, EC_NODUP, NULL)); taddstr("))"); stack = 1; break; case WC_TRY: if (!s) { taddstr("{"); tindent++; taddnl(0); n = tpush(code, 0); state->pc++; /* this is the end of the try block alone */ n->u._subsh.end = state->pc + WC_CURSH_SKIP(state->pc[-1]); } else if (!s->pop) { state->pc = s->u._subsh.end; dec_tindent(); taddnl(0); taddstr("} always {"); tindent++; taddnl(0); s->pop = 1; } else { dec_tindent(); taddnl(0); taddstr("}"); stack = 1; } break; case WC_END: stack = 1; break; default: DPUTS(1, "unknown word code in gettext2()"); return; } } tdopending(); }
static mnumber setmathvar(struct mathvalue *mvp, mnumber v) { Param pm; if (mvp->pval) { /* * This value may have been hanging around for a while. * Be ultra-paranoid in checking the variable is still valid. */ char *s = mvp->lval, *ptr; Param pm; DPUTS(!mvp->lval, "no variable name but variable value in math"); if ((ptr = strchr(s, '['))) s = dupstrpfx(s, ptr - s); pm = (Param) paramtab->getnode(paramtab, s); if (pm == mvp->pval->pm) { if (noeval) return v; setnumvalue(mvp->pval, v); return v; } /* Different parameter, start again from scratch */ mvp->pval = NULL; } if (!mvp->lval) { zerr("lvalue required"); v.type = MN_INTEGER; v.u.l = 0; return v; } if (noeval) return v; untokenize(mvp->lval); pm = setnparam(mvp->lval, v); if (pm) { /* * If we are performing an assignment, we return the * number with the same type as the parameter we are * assigning to, in the spirit of the way assignments * in C work. Note this was a change to long-standing * zsh behaviour. */ switch (PM_TYPE(pm->node.flags)) { case PM_INTEGER: if (v.type != MN_INTEGER) { v.u.l = (zlong)v.u.d; v.type = MN_INTEGER; } break; case PM_EFLOAT: case PM_FFLOAT: if (v.type != MN_FLOAT) { v.u.d = (double)v.u.l; v.type = MN_FLOAT; } break; } } return v; }