void FORTRANIFY (shpdeallc) (void **addr, long *errcode, int *abort) { INIT_CHECK (); __shmem_trace (SHMEM_LOG_MEMORY, "shpdeallc(addr = %p, errcode = %d, abort = %d)", addr, *errcode, *abort); shfree (*addr); /* pass back status code */ *errcode = malloc_error; /* if malloc succeeded, nothing else to do */ if (malloc_error == SHMEM_MALLOC_OK) { return; /* NOT REACHED */ } /* failed somehow, we might have to abort */ __shmem_trace (*abort ? SHMEM_LOG_FATAL : SHMEM_LOG_MEMORY, "shpdeallc() failed: %s", sherror ()); /* MAYBE NOT REACHED */ }
void FORTRANIFY (shpclmove) (int *addr, int *length, long *errcode, int *abort) { INIT_CHECK (); addr = shrealloc (addr, *length); /* pass back status code */ *errcode = malloc_error; /* if malloc succeeded, nothing else to do */ if (malloc_error == SHMEM_MALLOC_OK) { return; /* NOT REACHED */ } /* failed somehow, we might have to abort */ __shmem_trace (*abort ? SHMEM_LOG_FATAL : SHMEM_LOG_MEMORY, "shpdeallc() failed: %s", sherror ()); /* MAYBE NOT REACHED */ }
static cstring_t evalvar(cstring_t p, int32_t flag) { uint32_t subtype; uint32_t varflags; cstring_t var; const_cstring_t val; size_t patloc; size_t c; int32_t set; int32_t special; size_t startloc; size_t varlen; size_t varlenb; int32_t easy; uint32_t quotes = flag & (EXP_FULL | EXP_CASE | EXP_REDIR); varflags = (uint32_t)*p++; subtype = varflags & VSTYPE; var = p; special = 0; if (!is_name(*p)) special = 1; p = strchr(p, '=') + 1; again: /* jump here after setting a variable with ${var=text} */ if (varflags & VSLINENO) { set = 1; special = 1; val = NULL; } else if (special) { set = varisset(var, varflags & VSNUL); val = NULL; } else { val = bltinlookup(var, 1); if (val == NULL || ((varflags & VSNUL) && val[0] == '\0')) { val = NULL; set = 0; } else set = 1; } varlen = 0; startloc = expdest - stackblock(); if (!set && uflag && *var != '@' && *var != '*') { switch (subtype) { case VSNORMAL: case VSTRIMLEFT: case VSTRIMLEFTMAX: case VSTRIMRIGHT: case VSTRIMRIGHTMAX: case VSLENGTH: sherror("%.*s: parameter not set", (int32_t)(p - var - 1), var); } } if (set && subtype != VSPLUS) { /* insert the value of the variable */ if (special) { if (varflags & VSLINENO) STPUTBIN(var, p - var - 1, expdest); else varvalue(var, varflags & VSQUOTE, subtype, flag); if (subtype == VSLENGTH) { varlenb = expdest - stackblock() - startloc; varlen = varlenb; if (localeisutf8) { val = stackblock() + startloc; for (; val != expdest; val++) if ((*val & 0xC0) == 0x80) varlen--; } expdest -= varlenb; // STADJUST(-varlenb, expdest); } } else { char const* syntax = (varflags & VSQUOTE) ? DQSYNTAX : BASESYNTAX; if (subtype == VSLENGTH) { for (; *val; val++) if (!localeisutf8 || (*val & 0xC0) != 0x80) varlen++; } else { if (quotes) STPUTS_QUOTES(val, syntax, expdest); else STPUTS(val, expdest); } } } if (subtype == VSPLUS) set = ! set; easy = ((varflags & VSQUOTE) == 0 || (*var == '@' && shellparam.nparam != 1)); switch (subtype) { case VSLENGTH: expdest = cvtnum(varlen, expdest); goto record; case VSNORMAL: if (!easy) break; record: recordregion(startloc, expdest - stackblock(), varflags & VSQUOTE || (ifsset() && ifsval()[0] == '\0' && (*var == '@' || *var == '*'))); break; case VSPLUS: case VSMINUS: if (!set) { argstr(p, flag | (flag & EXP_FULL ? EXP_SPLIT_LIT : 0) | (varflags & VSQUOTE ? EXP_LIT_QUOTED : 0)); break; } if (easy) goto record; break; case VSTRIMLEFT: case VSTRIMLEFTMAX: case VSTRIMRIGHT: case VSTRIMRIGHTMAX: if (!set) break; /* * Terminate the string and start recording the pattern * right after it */ STPUTC('\0', expdest); patloc = expdest - stackblock(); if (subevalvar(p, NULL, patloc, subtype, startloc, varflags, quotes) == 0) { size_t amount = (expdest - stackblock() - patloc) + 1; expdest -= amount; // STADJUST(-amount, expdest); } /* Remove any recorded regions beyond start of variable */ removerecordregions(startloc); goto record; case VSASSIGN: case VSQUESTION: if (!set) { if (subevalvar(p, var, 0, subtype, startloc, varflags, quotes) == 1) { varflags &= ~VSNUL; /* * Remove any recorded regions beyond * start of variable */ removerecordregions(startloc); goto again; } break; } if (easy) goto record; break; case VSERROR: c = p - var - 1; sherror("${%.*s%s}: Bad substitution", c, var, (c > 0 && *p != CTLENDVAR) ? "..." : ""); default: abort(); } if (subtype != VSNORMAL) /* skip to end of alternative */ { int32_t nesting = 1; for (;;) { if ((c = *p++) == CTLESC) p++; else if (c == CTLBACKQ || c == (CTLBACKQ | CTLQUOTE)) { if (set) argbackq = argbackq->next; } else if (c == CTLVAR) { if ((*p++ & VSTYPE) != VSNORMAL) nesting++; } else if (c == CTLENDVAR) { if (--nesting == 0) break; } } } return p; }
static int32_t subevalvar(cstring_t p, cstring_t str, size_t strloc, uint32_t subtype, size_t startloc, uint32_t varflags, uint32_t quotes) { cstring_t startp; cstring_t loc = NULL; cstring_t q; char32_t c = 0; struct nodelist* saveargbackq = argbackq; size_t amount; argstr(p, (subtype == VSTRIMLEFT || subtype == VSTRIMLEFTMAX || subtype == VSTRIMRIGHT || subtype == VSTRIMRIGHTMAX ? EXP_CASE : 0) | EXP_TILDE); STACKSTRNUL(expdest); argbackq = saveargbackq; startp = stackblock() + startloc; if (str == NULL) str = stackblock() + strloc; switch (subtype) { case VSASSIGN: setvar(str, startp, 0); amount = startp - expdest; STADJUST(amount, expdest); varflags &= ~VSNUL; return 1; case VSQUESTION: if (*p != CTLENDVAR) { outfmt(out2, "%s\n", startp); sherror((cstring_t)NULL); } sherror("%.*s: parameter %snot set", (int32_t)(p - str - 1), str, (varflags & VSNUL) ? "null or " : nullstr); NOTREACHED; case VSTRIMLEFT: for (loc = startp; loc < str; loc++) { c = *loc; *loc = '\0'; if (patmatch(str, startp, quotes)) { *loc = (cchar_t)c; goto recordleft; } *loc = (cchar_t)c; if (quotes && *loc == CTLESC) loc++; } return 0; case VSTRIMLEFTMAX: for (loc = str - 1; loc >= startp;) { c = *loc; *loc = '\0'; if (patmatch(str, startp, quotes)) { *loc = (cchar_t)c; goto recordleft; } *loc = (cchar_t)c; loc--; if (quotes && loc > startp && *(loc - 1) == CTLESC) { for (q = startp; q < loc; q++) if (*q == CTLESC) q++; if (q > loc) loc--; } } return 0; case VSTRIMRIGHT: for (loc = str - 1; loc >= startp;) { if (patmatch(str, loc, quotes)) { amount = loc - expdest; STADJUST(amount, expdest); return 1; } loc--; if (quotes && loc > startp && *(loc - 1) == CTLESC) { for (q = startp; q < loc; q++) if (*q == CTLESC) q++; if (q > loc) loc--; } } return 0; case VSTRIMRIGHTMAX: for (loc = startp; loc < str - 1; loc++) { if (patmatch(str, loc, quotes)) { amount = loc - expdest; STADJUST(amount, expdest); return 1; } if (quotes && *loc == CTLESC) loc++; } return 0; default: abort(); } recordleft: amount = ((str - 1) - (loc - startp)) - expdest; STADJUST(amount, expdest); while (loc != str - 1) *startp++ = *loc++; return 1; }