open.c revision 3f54fd611f536639ec30dd53c48e5ec1897cc7d9
8a77240a809197c92c0736c431b4b88947a7bac1Christian Maeder/***********************************************************************
d9a45a35cd696085be1a038b2cc67bee6819c574cmaeder* *
8a77240a809197c92c0736c431b4b88947a7bac1Christian Maeder* This software is part of the ast package *
adea2e45fa61f1097aadc490a0aeaf4831b729ccChristian Maeder* Copyright (c) 2003-2011 AT&T Intellectual Property *
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski* and is licensed under the *
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder* Eclipse Public License, Version 1.0 *
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski* by AT&T Intellectual Property *
98890889ffb2e8f6f722b00e265a211f13b5a861Corneliu-Claudiu Prodescu* *
2eeec5240b424984e3ee26296da1eeab6c6d739eChristian Maeder* A copy of the License is available at *
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski* http://www.eclipse.org/org/documents/epl-v10.html *
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
f3a94a197960e548ecd6520bb768cb0d547457bbChristian Maeder* *
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder* Information and Software Systems Research *
0095c7efbddd0ffeed6aaf8ec015346be161d819Till Mossakowski* AT&T Research *
adea2e45fa61f1097aadc490a0aeaf4831b729ccChristian Maeder* Florham Park NJ *
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski* *
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski* Glenn Fowler <gsf@research.att.com> *
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder* *
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder***********************************************************************/
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder#pragma prototyped
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder/*
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * jcl handle open/close
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski */
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski#include "jcllib.h"
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till MossakowskiRedirect_t redirect[] =
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski{
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder { "SYSOUT", 1 },
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder { "SYSERR", 2 },
ad270004874ce1d0697fb30d7309f180553bb315Christian Maeder};
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder
d9a45a35cd696085be1a038b2cc67bee6819c574cmaeder/*
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder * open a handle to the jcl deck
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder */
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder
d3c9318c22fcf44d9135a3b2c64f880b9a785babChristian MaederJcl_t*
d9a45a35cd696085be1a038b2cc67bee6819c574cmaederjclopen(Jcl_t* scope, const char* file, unsigned long flags, Jcldisc_t* disc)
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski{
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski register Jcl_t* jcl;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski Dt_t* dt;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski Sfio_t* sp;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder Vmalloc_t* vm;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski Vmalloc_t* vs;
adea2e45fa61f1097aadc490a0aeaf4831b729ccChristian Maeder int i;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski if (!(vm = vmopen(Vmdcheap, Vmbest, 0)) || !(vs = vmopen(Vmdcheap, Vmbest, 0)))
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder {
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder nospace(NiL, disc);
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder if (vm)
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder vmclose(vm);
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder return 0;
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder }
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder if (!(jcl = vmnewof(vm, 0, Jcl_t, 1, 0)))
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder {
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder nospace(NiL, disc);
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski vmclose(vm);
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder vmclose(vs);
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder return 0;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder }
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski jcl->id = "jcl";
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski jcl->vs = jcl->vm = vm;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski jcl->vx = vs;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski jcl->disc = disc;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski jcl->flags = flags & JCL_INHERIT;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder jcl->scope = scope;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder jcl->step = &jcl->current;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder for (i = 0; i < elementsof(redirect); i++)
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder jcl->redirect[i] = dup(redirect[i].fd);
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder if (!(jcl->cp = sfstropen()) || !(jcl->rp = sfstropen()) || !(jcl->tp = sfstropen()) || !(jcl->vp = sfstropen()) || !(jcl->xp = sfstropen()))
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder goto mem;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder jcl->dddisc.link = offsetof(Jcldd_t, link);
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder jcl->dddisc.key = offsetof(Jcldd_t, name);
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder jcl->dddisc.size = -1;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder jcl->outdirdisc.link = offsetof(Jcldir_t, link);
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski jcl->outdirdisc.key = offsetof(Jcldir_t, name);
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski jcl->outdirdisc.size = 0;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski jcl->outputdisc.link = offsetof(Jcloutput_t, link);
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder jcl->outputdisc.key = offsetof(Jcloutput_t, name);
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder jcl->outputdisc.size = -1;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder jcl->rcdisc.link = offsetof(Rc_t, link);
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder jcl->rcdisc.key = offsetof(Rc_t, name);
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski jcl->rcdisc.size = 0;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski jcl->symdisc.link = offsetof(Jclsym_t, link);
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder jcl->symdisc.key = offsetof(Jclsym_t, name);
adea2e45fa61f1097aadc490a0aeaf4831b729ccChristian Maeder jcl->symdisc.size = 0;
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder if (!(jcl->dd = dtnew(jcl->vm, &jcl->dddisc, Dtoset)) ||
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski !(jcl->ds = dtnew(jcl->vm, &jcl->dddisc, Dtoset)) ||
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski !(jcl->outdir = dtnew(jcl->vm, &jcl->outdirdisc, Dtoset)) ||
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski !(jcl->output = dtnew(jcl->vm, &jcl->outputdisc, Dtoset)) ||
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder !(jcl->rcs = dtnew(jcl->vm, &jcl->rcdisc, Dtoset)) ||
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski !(jcl->syms = dtnew(jcl->vm, &jcl->symdisc, Dtoset)) ||
4ef5e33657aae95850b7e6941f67ac1fb73cd13fChristian Maeder !(jcl->ss = dtnew(jcl->vm, &jcl->symdisc, Dtoset)) ||
4ef5e33657aae95850b7e6941f67ac1fb73cd13fChristian Maeder !(jcl->step->syms = dtnew(jcl->vm, &jcl->symdisc, Dtoset)))
4ef5e33657aae95850b7e6941f67ac1fb73cd13fChristian Maeder goto mem;
e7d2b3903c7b44db432538b0d720c21062c24823Christian Maeder jcl->step->dd = jcl->ds;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski jcl->step->syms = jcl->ss;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski if (!(flags & JCL_SCOPE))
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski {
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder if (!file || streq(file, "-") || streq(file, "/dev/stdin"))
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski {
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski file = 0;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski sp = sfstdin;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder }
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski else if (!(file = jclfind(jcl, file, flags, 2, &sp)))
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski goto bad;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder if (jclpush(jcl, sp, file, 0))
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski goto bad;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski if (!jclstep(jcl))
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski goto bad;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski dt = jcl->dd;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski jcl->dd = jcl->ds;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder jcl->ds = dt;
a98fd29a06e80e447af26d898044c23497adbc73Mihai Codescu dt = jcl->output;
a98fd29a06e80e447af26d898044c23497adbc73Mihai Codescu if (!jcl->name && error_info.line && jcl->disc->errorf)
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski (*jcl->disc->errorf)(NiL, jcl->disc, 1, "no JOB or PROC statement");
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski }
e7d2b3903c7b44db432538b0d720c21062c24823Christian Maeder jcl->vs = vs;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder return jcl;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski mem:
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski nospace(jcl, NiL);
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski bad:
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder jclclose(jcl);
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski return 0;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski}
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski/*
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * close jcl handle
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski */
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maederint
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowskijclclose(Jcl_t* jcl)
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder{
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski int i;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski int r;
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski
df11e5eab86d8247f58e301d8f0a2c6ecf4c9541Till Mossakowski if (!jcl)
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder return -1;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder if ((r = jcl->rc) < 0)
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder r = 256 + 6;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder sfsync(sfstdout);
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder sfsync(sfstderr);
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder for (i = 0; i < elementsof(redirect); i++)
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder if (jcl->redirect[i] >= 0)
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder dup2(jcl->redirect[i], redirect[i].fd);
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder if (!jcl->scope && jclstats(sfstdout, jcl->flags, jcl->disc))
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder r = -1;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder while (jclpop(jcl) > 0);
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder if (jcl->cp)
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder sfclose(jcl->cp);
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder if (jcl->dp)
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder sfclose(jcl->dp);
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder if (jcl->rp)
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder sfclose(jcl->rp);
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder if (jcl->tp)
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder sfclose(jcl->tp);
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder if (jcl->vp)
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder sfclose(jcl->vp);
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder if (jcl->xp)
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder sfclose(jcl->xp);
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder vmclose(jcl->vx);
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder vmclose(jcl->vm);
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder return r;
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder}
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder/*
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder * push an include file
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder */
c911a0ec80ca4a178399c68f1e28be4e2bf42fceChristian Maeder
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maederint
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maederjclpush(register Jcl_t* jcl, Sfio_t* sp, const char* file, long line)
556f473448dfcceee22afaa89ed7a364489cdbbbChristian Maeder{
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder register Include_t* ip;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder if (!(ip = vmnewof(jcl->vm, 0, Include_t, 1, file ? strlen(file) : 0)))
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder {
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder nospace(jcl, NiL);
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder return -1;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder }
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder ip->sp = jcl->sp;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder jcl->sp = sp;
a65c6747c9acbbebc93baba7bae94d2e3d8cdafbTill Mossakowski ip->file = error_info.file;
4d7d53fec6b551333c79da6ae3b8ca2af0a741abChristian Maeder error_info.file = file ? strcpy(ip->path, file) : (char*)0;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder ip->line = error_info.line;
c911a0ec80ca4a178399c68f1e28be4e2bf42fceChristian Maeder error_info.line = 0;
d9a45a35cd696085be1a038b2cc67bee6819c574cmaeder ip->prev = jcl->include;
d9a45a35cd696085be1a038b2cc67bee6819c574cmaeder jcl->include = ip;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder if (file && (jcl->flags & JCL_LISTSCRIPTS))
3f5a42972cccb9c4fd0821def1292ec40b7a4871cmaeder uniq(file, NiL, 0, jcl->disc);
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder return 0;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder}
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder
3f5a42972cccb9c4fd0821def1292ec40b7a4871cmaeder/*
cd6e5706893519bfcf24539afa252fcbed5097ddKlaus Luettich * pop the top include file
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * return
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder * >0 some includes left
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder * 0 last include popped
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder * <0 no includes left
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder */
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maederint
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maederjclpop(Jcl_t* jcl)
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder{
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder Include_t* ip;
e7d2b3903c7b44db432538b0d720c21062c24823Christian Maeder
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder if (!(ip = jcl->include))
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder return -1;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder jcl->include = ip->prev;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder if (jcl->sp != sfstdin)
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder sfclose(jcl->sp);
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder jcl->sp = ip->sp;
e8eb2b9d68adc3024eb1aa9899b902ed5a3fb460Christian Maeder error_info.file = ip->file;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder error_info.line = ip->line;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder vmfree(jcl->vm, ip);
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder return jcl->sp != 0;
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder}
09b431a868c79a92ae7c9bd141565f43f9034144Christian Maeder