	subroutine cprod(error)
#
# C-Produktionen 
#	CP1:	C	->	a C
#	CP2:	C	->	E
#	CP3:	C	->	F
# Bei Nichtanwendbarkeit bzw. Stack-Ueberlauf ist error=true, sonst =false.
#
# Externe Routinen:
# Name		File, Bibliothek
# durchp	SUBS		best. den Durchtrittspunkt
# mstuck	SUBS		testet auf Markscheidenstueck
# winkr		SUBS		Steigung nach Winkelinkrement
# idist		SUBS		Integer-Abstand
# push		SUBS		bringt Element in den Stack
#
# Version 0.1	15.05.85
#
include defsym.rat
#
logical	error		# Error Flag
logical	show		# mit/ohne Bildschirm-Ausgabe
logical	mstuck		# function, entscheidet ueber Markscheidenstueck
#
integer	prod		# Produktionsnummer
integer	bog,minbog	# Bogenlaenge, minimale B.
integer	dx,dy		# Koord'inkremente
integer	laenge		# Strahllaenge
integer	px,py,		# Durchtrittspunkt
	tx,ty,ux,uy,	# Anf. und Endpunkt des Kurvensegments
	vx,vy		# Strahl ab v
integer	bb,breite	# alte und ggf. neue Bandbreite
integer	idist		# function, liefert Punktabstand
#
common	/punkte/tx,ty,ux,uy,vx,vy,bb
common	/para/bog,minbog
common	/flags/show
#
#	Segmentierung
#
if (show) write(1,10) 
10 format(' CPROD')
#
error=.false.
call winkr(minbog,dx,dy)		# Steigung nach min.Winkelinkrement
if (dx==0 && dy==0) prod=CP3
else
[	i=idist(vx,vy,tx,ty) ; j=idist(vx,vy,ux,uy)	# Teststrahl
	laenge=max0(2*i,j) ; call durchp(laenge,dx,dy,px,py,breite)
	if (px==0) prod=CP2
	else
	[	if (mstuck(tx,ty,px,py)) prod=CP1
		else prod=CP2
]	]
#
#	Anwendung der Produktion
#
if (prod==CP1)
[	if (show) write(1,20)
	20 format(' (C1) C->aD')
	call push(XD,px,py,ux,uy,vx,vy,breite,error)
	call push(XAT,tx,ty,px,py,vx,vy,bb,error)
]
else if (prod==CP2)
[	if (show) write(1,30)
	30 format(' (C2) C->E')
	call push(XE,tx,ty,ux,uy,vx,vy,bb,error)
]
else if (prod==CP3)
[	if (show) write(1,40)
	40 format(' (C3) C->F')
	call push(XF,tx,ty,ux,uy,vx,vy,bb,error)
]
else
[	error=.true.
	write(1,90) 
	90 format(' *** CPROD - nicht anwendbar ***')
]
return
end

