static void put_time(Namval_t* np, const char* val, int flag, Namfun_t* nfp) { struct dctime *dp = (struct dctime*)nfp; char *last; if(val) { int32_t t; if(flag&NV_INTEGER) { if(flag&NV_LONG) t = *(Sfdouble_t*)val; else t = *(double*)val; } else { t = tmdate(val, &last, (time_t*)0); if(*last) errormsg(SH_DICT,ERROR_exit(1),"%s: invalid date/time string",val); } nv_putv(np,(char*)&t,NV_INTEGER,nfp); } else { nv_unset(dp->format); free((void*)dp->format); nv_putv(np,val,flag,nfp); } }
static_fn void put_enum(Namval_t *np, const void *val, nvflag_t flags, Namfun_t *fp) { struct Enum *ep = (struct Enum *)fp; const char *v; int n; if (!val && !(flags & NV_INTEGER)) { nv_putv(np, val, flags, fp); nv_disc(np, &ep->namfun, DISC_OP_POP); if (!ep->namfun.nofree) free_enum(ep); return; } if (flags & NV_INTEGER) { nv_putv(np, val, flags, fp); return; } for (int i = 0; i < ep->nelem; i++) { v = ep->values[i]; if (ep->iflag) { n = strcasecmp(v, val); } else { n = strcmp(v, val); } if (n == 0) { // TODO: Figure out if a static var is correct. The code used to store a pointer to the // stack local var `i` which is obviously wrong and only works by accident if the // pointer is used before the stack location is overwritten. static uint16_t x; x = i; nv_putv(np, (char *)&x, NV_UINT16, fp); return; } } if (nv_isattr(np, NV_NOFREE)) error(ERROR_exit(1), "%s: invalid value %s", nv_name(np), val); }
static void put_enum(Namval_t* np,const char *val,int flags,Namfun_t *fp) { struct Enum *ep = (struct Enum*)fp; register const char *v; unsigned short i=0, n; if(!val && !(flags&NV_INTEGER)) { nv_putv(np, val, flags,fp); nv_disc(np,&ep->hdr,NV_POP); if(!ep->hdr.nofree) free((void*)ep); return; } if(flags&NV_INTEGER) { nv_putv(np,val,flags,fp); return; } while(v=ep->values[i]) { if(ep->iflag) n = strcasecmp(v,val); else n = strcmp(v,val); if(n==0) { nv_putv(np, (char*)&i, NV_UINT16, fp); return; } i++; } if(nv_isattr(np,NV_NOFREE)) error(ERROR_exit(1), "%s: invalid value %s",nv_name(np),val); }
static_fn void put_funcname(Namval_t *np, const void *val, int flags, Namfun_t *fp) { // Bash silently returns with an error when FUNCNAME is set, unsetting // FUNCNAME is allowed. if (val && !(flags & NV_RDONLY)) sh_exit(sh_getinterp(), 1); nv_putv(np, val, flags, fp); }
static void put_funcname(register Namval_t* np,const char *val,int flags,Namfun_t *fp) { /* bash silently returns with an error when FUNCNAME is set, unsetting FUNCNAME is allowed */ if(val && !(flags&NV_RDONLY)) error_info.exit(1); nv_putv(np,val,flags,fp); }
static void put_globignore(register Namval_t* np, const char *val, int flags, Namfun_t *fp) { if(val) sh_onoption(SH_DOTGLOB); else sh_offoption(SH_DOTGLOB); nv_putv(np,val,flags,fp); }
static_fn void put_globignore(Namval_t *np, const void *val, int flags, Namfun_t *fp) { Shell_t *shp = np->nvshell; if (val) { sh_onoption(shp, SH_DOTGLOB); } else { sh_offoption(shp, SH_DOTGLOB); } nv_putv(np, val, flags, fp); }
static void put_mode(Namval_t* np, const char* val, int flag, Namfun_t* nfp) { if(val) { int32_t mode; char *last; if(flag&NV_INTEGER) { if(flag&NV_LONG) mode = *(Sfdouble_t*)val; else mode = *(double*)val; } else { mode = strperm(val, &last,0); if(*last) errormsg(SH_DICT,ERROR_exit(1),"%s: invalid mode string",val); } nv_putv(np,(char*)&mode,NV_INTEGER,nfp); } else nv_putv(np,val,flag,nfp); }