/*  --- Copyright University of Sussex 1995.  All rights reserved. ---------
 >  File:           C.all/lib/auto/foreach.p
 >  Purpose:        performs action on all items in database matching pattern.
 >  Author:         A.Sloman S.Hardy 1982 (see revisions)
 >  Documentation:  HELP * FOREACH
 >  Related Files:  LIB * FOREVERY, * DATABASE
 */
compile_mode :pop11 +strict;

section;

;;;  foreach _______pattern [in ____list] do _______actions endforeach
;;;
;;; where ____list defaults to database.


vars syntax endforeach = pop_undef;

define vars syntax foreach;
	lvars Patt, List, Lab, Endlab, Item, x;
	dlocal pop_new_lvar_list;
	lconstant eqname =
				#_IF DEF DATABASE_USE_MATCHVARS or DEF POPC_COMPILING "="
				#_ELSE "matches"
				#_ENDIF;
	sysNEW_LVAR() -> Patt;
	sysNEW_LVAR() -> List;
	sysNEW_LVAR() -> Item;
	pop11_loop_start(sysNEW_LABEL() ->> Lab);
	pop11_loop_end(sysNEW_LABEL() ->> Endlab);
	(pop11_comp_expr_to([do then in]) -> x) -> sysPUSH(Patt);
	if x == "in" then
		pop11_comp_expr_to([do then]) ->
	else
		sysPUSH("database")
	endif -> sysPUSH(List);

	sysLABEL(Lab);
		sysCALL(sysPUSH(List), "null"), sysIFSO(Endlab);

		sysCALL(sysPUSH(List), "fast_destpair")
								-> (sysPUSH(Item), sysPUSH(List));
		sysCALL(sysPUSH(Item), sysPUSH(Patt), eqname), sysIFNOT(Lab);
		sysPUSH(Item) -> sysPUSH("database_it");
		pop11_comp_stmnt_seq_to([endforeach close]) -> ;
		sysGOTO(Lab);

	sysLABEL(Endlab);
enddefine;

endsection;



/* --- Revision History ---------------------------------------------------
--- John Gibson, Dec 23 1995
		Rewritten and moved to $popautolib
--- Poplog Documentor, Dec 16 1987 (Ian Rogers)
	updated compiler proc names.
--- Aaron Sloman, Nov  7 1986 lvarsed, desectionised.
*/
