Beispiel #1
0
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 */
}
Beispiel #2
0
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 */
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;
}