aboutsummaryrefslogtreecommitdiff
path: root/sys/fmtio/strmac.x
blob: 1f3f3e98dc7bee624df38d48e8136e85edb76e35 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.

include	<ctype.h>

define	MAX_ARGS	9

.help strmac
.nf ___________________________________________________________________________
STRMAC -- Expand a macro (nonrecursively) by string substitution.
The macro string may contain zero or more occurrences of the sequences
"$1" through "$9".  The substitution strings are passed in the string
buffer "argstr", wherein successive strings are delimited by the EOS marker.
A double EOS marks the end of the list.

Macros $1-$9 are replaced by the substitution string.  The sequence $$ is
replaced by a single $.  If any other character follows the $, both the $
and the following character are passed to the output unchanged.  An error
action is taken if there are insufficient arguments or if the output buffer
overflows.  Bugs: null substitution strings don't work.
.endhelp ______________________________________________________________________

int procedure strmac (macro, argstr, outstr, maxch)

char	macro[ARB]		# substitution string
char	argstr[ARB]		# argument strings, if any
char	outstr[maxch]		# output string
int	maxch	

short	offset[MAX_ARGS]
char	ch
int	i, ip, op, arg, nargs, nchars
int	strlen()

begin
	# Determine the offsets of the argument strings.
	ip = 1
	for (nargs=1;  nargs <= MAX_ARGS;  nargs=nargs+1) {
	    nchars = strlen (argstr[ip])
	    if (nchars > 0) {
		offset[nargs] = ip
		ip = ip + nchars + 1
	    } else
		break
	}
	nargs = nargs - 1

	# Expand the macro. 
	op = 1
	for (ip=1;  macro[ip] != EOS;  ip=ip+1) {
	    ch = macro[ip]

	    if (ch == '$') {			# Process $ arg sequence.
		ip = ip + 1
		ch = macro[ip]
		if (ch >= '1' && ch <= '9') {
		    arg = TO_INTEG(ch)
		    if (arg > nargs)
			call error (1, "Strmac: too few substitution arguments")
		    for (i = offset[arg];  argstr[i] != EOS;  i=i+1) {
			outstr[op] = argstr[i]
			op = op + 1
		    }

		} else if (ch == '$') {		# "$$" --> "$"
		    outstr[op] = '$'
		    op = op + 1

		} else {			# "$?" --> "$?"
		    outstr[op] = '$'
		    op = op + 1
		    outstr[op] = ch
		    op = op + 1
		}

	    } else {				# ordinary character
		outstr[op] = ch
		op = op + 1
	    }

	    if (op > maxch)
		call error (2, "Strmac: output buffer overflow")
	}

	outstr[op] = EOS
	return (op - 1)
end