This is loop.c in view mode; [Download] [Up]
/* * $Id: loop.c,v 2.4 1996/10/15 20:16:35 hzoli Exp $ * * loop.c - loop execution * * This file is part of zsh, the Z shell. * * Copyright (c) 1992-1996 Paul Falstad * All rights reserved. * * Permission is hereby granted, without written agreement and without * license or royalty fees, to use, copy, modify, and distribute this * software and to distribute modified versions of this software for any * purpose, provided that the above copyright notice and the following * two paragraphs appear in all copies of this software. * * In no event shall Paul Falstad or the Zsh Development Group be liable * to any party for direct, indirect, special, incidental, or consequential * damages arising out of the use of this software and its documentation, * even if Paul Falstad and the Zsh Development Group have been advised of * the possibility of such damage. * * Paul Falstad and the Zsh Development Group specifically disclaim any * warranties, including, but not limited to, the implied warranties of * merchantability and fitness for a particular purpose. The software * provided hereunder is on an "as is" basis, and Paul Falstad and the * Zsh Development Group have no obligation to provide maintenance, * support, updates, enhancements, or modifications. * */ #include "zsh.h" /**/ int execfor(Cmd cmd) { List list; Forcmd node; char *str; LinkList args; loops++; lastval = 0; node = cmd->u.forcmd; args = cmd->args; if (!node->inflag) { char **x; args = newlinklist(); for (x = pparams; *x; x++) addlinknode(args, ztrdup(*x)); } pushheap(); while ((str = (char *)ugetnode(args))) { setsparam(node->name, ztrdup(str)); list = (List) dupstruct(node->list); execlist(list, 1, (cmd->flags & CFLAG_EXEC) && empty(args)); if (breaks) { breaks--; if (breaks || !contflag) break; contflag = 0; } if (errflag) { lastval = 1; break; } freeheap(); } popheap(); loops--; return lastval; } /**/ int execselect(Cmd cmd) { List list; Forcmd node; char *str, *s; LinkList args; LinkNode n; int i; FILE *inp; node = cmd->u.forcmd; args = cmd->args; if (!node->inflag) { char **x; args = newlinklist(); for (x = pparams; *x; x++) addlinknode(args, ztrdup(*x)); } if (empty(args)) return 1; loops++; lastval = 0; pushheap(); inp = fdopen(dup((SHTTY == -1) ? 0 : SHTTY), "r"); for (;;) { do { selectlist(args); if (empty(bufstack)) { if (interact && SHTTY != -1 && isset(USEZLE)) str = (char *)zleread(prompt3, NULL); else { int pptlen; str = putprompt(prompt3, &pptlen, NULL, 1); fwrite(str, pptlen, 1, stderr); free(str); fflush(stderr); str = fgets(zalloc(256), 256, inp); } } else str = (char *)getlinknode(bufstack); if (!str || errflag) { if (breaks) breaks--; fprintf(stderr, "\n"); fflush(stderr); goto done; } if ((s = strchr(str, '\n'))) *s = '\0'; } while (!*str); setsparam("REPLY", ztrdup(str)); i = atoi(str); if (!i) str = ""; else { for (i--, n = firstnode(args); n && i; incnode(n), i--); if (n) str = (char *) getdata(n); else str = ""; } setsparam(node->name, ztrdup(str)); list = (List) dupstruct(node->list); execlist(list, 1, 0); freeheap(); if (breaks) { breaks--; if (breaks || !contflag) break; contflag = 0; } if (errflag) break; } done: popheap(); fclose(inp); loops--; return lastval; } /**/ int execwhile(Cmd cmd) { List list; struct whilecmd *node; int olderrexit, oldval; olderrexit = noerrexit; node = cmd->u.whilecmd; oldval = 0; pushheap(); loops++; for (;;) { list = (List) dupstruct(node->cont); noerrexit = 1; execlist(list, 1, 0); noerrexit = olderrexit; if (!((lastval == 0) ^ node->cond)) { if (breaks) breaks--; lastval = oldval; break; } list = (List) dupstruct(node->loop); execlist(list, 1, 0); if (breaks) { breaks--; if (breaks || !contflag) break; contflag = 0; } freeheap(); if (errflag) { lastval = 1; break; } oldval = lastval; } popheap(); loops--; return lastval; } /**/ int execrepeat(Cmd cmd) { List list; int count; lastval = 0; if (empty(cmd->args) || nextnode(firstnode(cmd->args))) { zerr("bad argument for repeat", NULL, 0); return 1; } count = atoi(peekfirst(cmd->args)); pushheap(); loops++; while (count--) { list = (List) dupstruct(cmd->u.list); execlist(list, 1, 0); freeheap(); if (breaks) { breaks--; if (breaks || !contflag) break; contflag = 0; } if (errflag) { lastval = 1; break; } } popheap(); loops--; return lastval; } /**/ int execif(Cmd cmd) { struct ifcmd *node; int olderrexit; List *i, *t; olderrexit = noerrexit; node = cmd->u.ifcmd; i = node->ifls; t = node->thenls; if (!noerrexit) noerrexit = 1; while (*i) { execlist(*i, 1, 0); if (!lastval) break; i++; t++; } noerrexit = olderrexit; if (*t) execlist(*t, 1, cmd->flags & CFLAG_EXEC); else lastval = 0; return lastval; } /**/ int execcase(Cmd cmd) { struct casecmd *node; char *word; List *l; char **p; node = cmd->u.casecmd; l = node->lists; p = node->pats; word = *p++; singsub(&word); untokenize(word); lastval = 0; if (node) { while (*p) { singsub(p); if (matchpat(word, *p)) break; p++; l++; } if (*l) execlist(*l, 1, cmd->flags & CFLAG_EXEC); } return lastval; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.