/*
* 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