Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/nmake/Scanrules.mk
1808 views
/*
 * Glenn Fowler
 * AT&T Research
 *
 * scan strategies -- oh no, another little language
 *
 * except for .SCAN.c, which must differentiate "..." from <...>,
 * .SOURCE.%.SCAN.<lang> should specify the binding dirs
 */

.SCANRULES.ID. = "@(#)$Id: Scanrules (AT&T Research) 2010-07-22 $"

/*
 * $(.INCLUDE. <lang> [<flag>])
 *
 * return <flag> option list for .SCAN.<lang>
 * .SCAN.c is handled in .MAKEINIT
 */

.INCLUDE. : .FUNCTION
	return $(*.SOURCE.%.SCAN.$(%:O=1):I=$$(!$(**:O=1):P=D):$(%:O=2:?/^/$$(%:O=2)/))

.LCL.INCLUDE : .ATTRIBUTE
.PFX.INCLUDE : .ATTRIBUTE .TERMINAL
.STD.INCLUDE : .ATTRIBUTE

.ACCEPT .IGNORE .RETAIN : .LCL.INCLUDE .PFX.INCLUDE .STD.INCLUDE

/*
 * .PFX.INCLUDE stuff needed for C #include "..." compatibility
 * --noprefix-include to turn off the hack
 */

.BIND.%.PFX.INCLUDE : .FUNCTION
	if "$(%:A=.DONTCARE)"
		$(%:B:S) : .DONTCARE
	end
	return $(%:B:S)

.PREFIX.INCLUDE. : .FUNCTION
	if "$(%%)" != "/*" && "$(<<:O=1:P=U)" != "." && ( "$(-target-context)" || "$(-recurse)" == "combine" && "$(%%:P=U)" != "*/*" || "$(<<:A:A=.SCAN:O=1)" == "$(<<<:A:A=.SCAN:O=1)" && "$(%%:P=U:D)" == ".|../*" )
		$(%%) : .LCL.INCLUDE
		if ! "$(%%:T=XG)"
			local B
			B := $(<<`;O=1;P=U;D;B=$$(%%);P=C)
			if B == "../*"
				B := $(<<<:O=1:P=U:D)/$(B)
				B := $(B:P=C)
			end
			$(B) : .PFX.INCLUDE
			if "$(%%:A=.DONTCARE)"
				$(B) : .DONTCARE
			end
			return $(B)
		end
	end
	return $(%%)

.PREFIX.SOURCE. : .FUNCTION
	if ! "$(-prefix-include)" && ! "$(-target-context)"
		local P S
		P := $(!$(%):A=.PFX.INCLUDE)
		if S = "$(P:P=U:D:U:N!=.)"
			return $(P:P=D:X=$(S):T>FD:U)
		end
	end

.SOURCE.%.LCL.INCLUDE : .FORCE $$(*.SOURCE.c) $$(*.SOURCE) $$(*.SOURCE.h)

.SOURCE.%.STD.INCLUDE : .FORCE $$(*.SOURCE.h)

.SCAN.c : .SCAN
	O|S|
	Q|/*|*/||C|
	Q|//||\\|LC|
	Q|"|"|\\|LQ|
	Q|'|'|\\|LQ|
	Q|\\|||CS|
	D| \# define %|
	B| \# if|
	E| \# endif|
	I| \# include <%>|A.STD.INCLUDE|R$$(%:P=U:D:S:N=.:?$$$(%)??):.TERMINAL|
	I| \# include "%"|A.LCL.INCLUDE|R$$(%:P=U:D:S:N=.:?$$$(%)??):.TERMINAL|M$$(.PREFIX.INCLUDE.)|
	I| \# pragma library "%"|A.VIRTUAL|A.ACCEPT|M.LIBRARY.$$(%)|

$("$(.SUFFIX.c) $(.SUFFIX.C) .h .S":/^/.ATTRIBUTE.%/) : .SCAN.c

.SCAN.f : .SCAN
	I| include '%'|
	I| INCLUDE '%'|

$(.SUFFIX.f:/^/.ATTRIBUTE.%/) : .SCAN.f

.SOURCE.%.SCAN.m4 : $$(*.SOURCE.m4) $$(*.SOURCE) $$(*.SOURCE.h)

.SCAN.m4 : .SCAN
	O|M|
	I|%|

.SCAN.mk : .SCAN
	Q|/*|*/||CW|
	Q|"|"|\\|LQ|
	Q|'|'|\\|LQ|
	Q|\\|||CS|
	B|if|
	B| \# if|
	E|end|
	E| \# endif|
	I|include - "%"|A.DONTCARE|M$$(%)|
	I|include - %|A.DONTCARE|M$$(%)|
	I|include "%"|M$$(%)|
	I|include %|M$$(%)|
	I| \# include <%>|A.STD.INCLUDE|
	I| \# include "%"|A.LCL.INCLUDE|M$$(.PREFIX.INCLUDE.)|

.ATTRIBUTE.%.mk : .SCAN.mk

.SCAN.nroff : .SCAN
	I|.so % |A.DONTCARE|
	I|,so % |A.DONTCARE|
	I|.BP % |M$$(%:/\([\-,0-9]*\)$//)|A.DONTCARE|
	I|,BP % |M$$(%:/\([\-,0-9]*\)$//)|A.DONTCARE|

.SCAN.p : .SCAN
	Q|(*|*)||C|
	Q|{|}||C|
	Q|"|"|\\|LQ|
	I| \# include '%'|

.SCAN.r : .SCAN
	I| include '%'|
	I| include "%"|
	I| include % |
	I| INCLUDE '%'|
	I| INCLUDE "%"|
	I| INCLUDE % |

$(.SUFFIX.r:/^/.ATTRIBUTE.%/) : .SCAN.r

.SCAN.sh : .SCAN
	O|S|
	Q|#||\\|LCW|
	Q|'|'||Q|
	Q|$'|'|\\|Q|
	Q|\\|||QS|

.ATTRIBUTE.%.sh : .SCAN.sh

.BIND.%.SCAN.sql : .FUNCTION
	if "$(%:N!=*.h)"
		return $(%).h
	end

.SOURCE.%.SCAN.sql : .FORCE $$(*.SOURCE.sql) $$(*.SOURCE.h)

.SCAN.sql : .SCAN
	Q|/*|*/||C|
	Q|//||\\|LC|
	Q|"|"|\\|LQ|
	Q|'|'|\\|LQ|
	Q|\\|||CS|
	I| EXEC SQL include "%"|
	I| EXEC SQL include % |M$$(%:/;.*//)|
	I| \## include "%"|
	I| \## include % |M$$(%:/;.*//)|
	I| $ include <%> |
	I| $ include "%" |
	I| $ include '%' |
	I| $ include % |M$$(%:/;.*//)|

.SCAN.exec.sh : .SCAN
	$(@.SCAN.sh)
	I| : include@ % |OX|
	I| . % |A.DONTCARE|M$$(%:C%.*[`$&].*%%:C%['"]%%:C%["']$%%)|
	I| *< % |A.DONTCARE|M$$(%:C%.*[`$&].*%%:C%['"]%%:C%["']$%%)|

.ATTRIBUTE.features/%.sh : .SCAN.exec.sh

.INCLUDE.SUFFIX. : .FUNCTION
	local F L Q S T ignorecase
	for L $(%)
		if L == "--ignorecase"
			ignorecase = 1
		elif L != "--*"
			break
		end
	end
	F := $(%%:/ .*//:/\.$//:/'\(.*\)'/\1/)
	Q := $("\"")
	if F == "$(Q)*$(Q)"
		F := $(F:/^$(Q)//:/$(Q)$//)
	end
	if ! "$(F:S)"
		for S $(.SUFFIX.HEADER.$(L)) $(<<:S)
			T := $(F)$(S)
			$(T) : .SCAN.$(L)
			if "$(T:T=F)"
				F := $(T)
				break
			end
			if ignorecase
				if T != "*[[:lower:]]*"
					Q := $(T:F=%(lower)s)
					$(Q) : .SCAN.$(L)
					if "$(Q:T=F)"
						F := $(Q)
						break
					end
				elif T != "[*[[:upper:]]*"
					Q := $(T:F=%(upper)s)
					$(Q) : .SCAN.$(L)
					if "$(Q:T=F)"
						F := $(Q)
						break
					end
				end
			end
		end
	end
	return $(F)

.SCAN.iffe : .SCAN
	I| include % |
	I| inc % |
	I| set stdio % |

.ATTRIBUTE.features/% : .SCAN.iffe

.ATTRIBUTE.%.iffe : .SCAN.iffe