#ifdef HAVE_PUTENV
int
set_envvar(int f GCC_UNUSED, int n GCC_UNUSED)
{
    static TBUFF *var, *val;

    char *both;
    int rc;

    if ((rc = mlreply2("Environment variable: ", &var)) == ABORT) {
        /* EMPTY */ ;
    }
    else if ((rc = mlreply2("Value: ", &val)) == ABORT) {
        /* EMPTY */ ;
    }
    else if ((both = typeallocn(char, tb_length(var) + tb_length(val))) == 0) {
        rc = no_memory("set_envvar");
    }
    else {
        lsprintf(both, "%s=%s", tb_values(var), tb_values(val));
        putenv(both);           /* this will leak.  i think it has to. */
    }

    return rc;
}
#endif

static LINEPTR
alloc_LINE(BUFFER * bp)
{
    LINEPTR lp;

    if ((lp = bp->b_freeLINEs) != NULL) {
        bp->b_freeLINEs = lp->l_nxtundo;
    }
    else if ((lp = typealloc(LINE)) == NULL) {
        (void) no_memory("LINE");
    }
    return lp;
}

static Boolean
SaveConvertedLength(XtPointer *target, unsigned long source)
{
    Boolean result = False;

    *target = XtMalloc(4);
    if (*target != 0) {
        result = True;
        if (sizeof(unsigned long) == 4) {
            *(unsigned long *) *target = source;
        }
        else if (sizeof(unsigned) == 4) {
            *(unsigned *) *target = (unsigned) source;
        }
        else if (sizeof(unsigned short) == 4) {
            *(unsigned short *) *target = (unsigned short) source;
        }
        else {
            /* FIXME - does this depend on byte-order? */
            unsigned long temp = source;

            memcpy((char *) *target,
                   ((char *) &temp) + sizeof(temp) - 4,
                   (size_t) 4);
        }
    }
    return result;
}
