1: #include "../h/rt.h"
2:
3: /*
4: * write(a,b,...) - write arguments.
5: */
6:
7: Xwrite(nargs)
8: int nargs;
9: {
10: register int n;
11: char sbuf[MAXSTRING];
12: struct descrip arg;
13: FILE *f;
14: extern char *alcstr();
15:
16: f = stdout;
17: arg = nullstr;
18:
19: /*
20: * Loop through the arguments, dereferencing each in turn.
21: */
22: for (n = 1; n <= nargs; n++) {
23: arg = ARG(n);
24: DeRef(arg)
25:
26: if (!QUAL(arg) && TYPE(arg) == T_FILE) {/* Current argument is a file */
27: /*
28: * If this isn't the first argument, output a newline to the current
29: * file and flush it.
30: */
31: if (n > 1) {
32: putc('\n', f);
33: fflush(f);
34: }
35: /*
36: * Switch the current file to the file named by the current argument
37: * providing it is a file. arg is made to be a empty string to
38: * avoid a special case.
39: */
40: if ((BLKLOC(arg)->file.status & FS_WRITE) == 0)
41: runerr(213, &arg);
42: f = BLKLOC(arg)->file.fd;
43: arg = nullstr;
44: }
45: else { /* Current argument is a string */
46: /*
47: * On first argument, check to be sure that &output is open
48: * for output.
49: */
50: if (n == 1 && (k_output.status & FS_WRITE) == 0)
51: runerr(213, NULL);
52: /*
53: * Convert the argument to a string, defaulting to a empty string.
54: */
55: defany(&arg, &nullstr);
56: if (cvstr(&arg, sbuf) == NULL)
57: runerr(109, &arg);
58: /*
59: * Output the string.
60: */
61: putstr(f, STRLOC(arg), STRLEN(arg));
62: }
63: }
64: /*
65: * Append a newline to the file and flush it.
66: */
67: putc('\n', f);
68: fflush(f);
69: /*
70: * If the beginning of the last string output lies in sbuf,
71: * allocate it as a real string. Note that some of the string
72: * conversions don't always leave the converted string at the
73: * start of the conversion buffer, hence the range check.
74: */
75: if (STRLOC(arg) >= sbuf && STRLOC(arg) < sbuf + MAXSTRING) {
76: sneed(STRLEN(arg));
77: STRLOC(arg) = alcstr(STRLOC(arg), STRLEN(arg));
78: }
79: /*
80: * Return the string corresponding to the last argument.
81: */
82: ARG(0) = arg;
83: }
84:
85: Procblock(write,-1)
Defined functions
Xwrite
defined in line
7;
never used