Lines 1613-1640
Link Here
|
1613 |
FILE *fp; |
1613 |
FILE *fp; |
1614 |
const char *fname; |
1614 |
const char *fname; |
1615 |
int mode; /* '|', 'a', 'w' => LE/LT, GT */ |
1615 |
int mode; /* '|', 'a', 'w' => LE/LT, GT */ |
1616 |
} files[FOPEN_MAX] ={ |
1616 |
} *files; |
1617 |
{ NULL, "/dev/stdin", LT }, /* watch out: don't free this! */ |
1617 |
size_t nfiles; |
1618 |
{ NULL, "/dev/stdout", GT }, |
|
|
1619 |
{ NULL, "/dev/stderr", GT } |
1620 |
}; |
1621 |
|
1618 |
|
1622 |
void stdinit(void) /* in case stdin, etc., are not constants */ |
1619 |
void stdinit(void) /* in case stdin, etc., are not constants */ |
1623 |
{ |
1620 |
{ |
|
|
1621 |
nfiles = FOPEN_MAX; |
1622 |
files = calloc(nfiles, sizeof(*files)); |
1623 |
if (files == NULL) |
1624 |
FATAL("can't allocate file memory for %zu files", nfiles); |
1624 |
files[0].fp = stdin; |
1625 |
files[0].fp = stdin; |
|
|
1626 |
files[0].fname = "/dev/stdin"; |
1627 |
files[0].mode = LT; |
1625 |
files[1].fp = stdout; |
1628 |
files[1].fp = stdout; |
|
|
1629 |
files[1].fname = "/dev/stdout"; |
1630 |
files[1].mode = GT; |
1626 |
files[2].fp = stderr; |
1631 |
files[2].fp = stderr; |
|
|
1632 |
files[2].fname = "/dev/stderr"; |
1633 |
files[2].mode = GT; |
1627 |
} |
1634 |
} |
1628 |
|
1635 |
|
1629 |
FILE *openfile(int a, const char *us) |
1636 |
FILE *openfile(int a, const char *us) |
1630 |
{ |
1637 |
{ |
1631 |
const char *s = us; |
1638 |
const char *s = us; |
1632 |
int i, m; |
1639 |
size_t i; |
|
|
1640 |
int m; |
1633 |
FILE *fp = 0; |
1641 |
FILE *fp = 0; |
1634 |
|
1642 |
|
1635 |
if (*s == '\0') |
1643 |
if (*s == '\0') |
1636 |
FATAL("null file name in print or getline"); |
1644 |
FATAL("null file name in print or getline"); |
1637 |
for (i=0; i < FOPEN_MAX; i++) |
1645 |
for (i = 0; i < nfiles; i++) |
1638 |
if (files[i].fname && strcmp(s, files[i].fname) == 0) { |
1646 |
if (files[i].fname && strcmp(s, files[i].fname) == 0) { |
1639 |
if (a == files[i].mode || (a==APPEND && files[i].mode==GT)) |
1647 |
if (a == files[i].mode || (a==APPEND && files[i].mode==GT)) |
1640 |
return files[i].fp; |
1648 |
return files[i].fp; |
Lines 1644-1654
Link Here
|
1644 |
if (a == FFLUSH) /* didn't find it, so don't create it! */ |
1652 |
if (a == FFLUSH) /* didn't find it, so don't create it! */ |
1645 |
return NULL; |
1653 |
return NULL; |
1646 |
|
1654 |
|
1647 |
for (i=0; i < FOPEN_MAX; i++) |
1655 |
for (i = 0; i < nfiles; i++) |
1648 |
if (files[i].fp == 0) |
1656 |
if (files[i].fp == NULL) |
1649 |
break; |
1657 |
break; |
1650 |
if (i >= FOPEN_MAX) |
1658 |
if (i >= nfiles) { |
1651 |
FATAL("%s makes too many open files", s); |
1659 |
struct files *nf; |
|
|
1660 |
size_t nnf = nfiles + FOPEN_MAX; |
1661 |
nf = realloc(files, nnf * sizeof(*nf)); |
1662 |
if (nf == NULL) |
1663 |
FATAL("cannot grow files for %s and %zu files", s, nnf); |
1664 |
(void)memset(&nf[nfiles], 0, FOPEN_MAX * sizeof(*nf)); |
1665 |
nfiles = nnf; |
1666 |
files = nf; |
1667 |
} |
1652 |
fflush(stdout); /* force a semblance of order */ |
1668 |
fflush(stdout); /* force a semblance of order */ |
1653 |
m = a; |
1669 |
m = a; |
1654 |
if (a == GT) { |
1670 |
if (a == GT) { |
Lines 1674-1682
Link Here
|
1674 |
|
1690 |
|
1675 |
const char *filename(FILE *fp) |
1691 |
const char *filename(FILE *fp) |
1676 |
{ |
1692 |
{ |
1677 |
int i; |
1693 |
size_t i; |
1678 |
|
1694 |
|
1679 |
for (i = 0; i < FOPEN_MAX; i++) |
1695 |
for (i = 0; i < nfiles; i++) |
1680 |
if (fp == files[i].fp) |
1696 |
if (fp == files[i].fp) |
1681 |
return files[i].fname; |
1697 |
return files[i].fname; |
1682 |
return "???"; |
1698 |
return "???"; |
Lines 1685-1697
Link Here
|
1685 |
Cell *closefile(Node **a, int n) |
1701 |
Cell *closefile(Node **a, int n) |
1686 |
{ |
1702 |
{ |
1687 |
Cell *x; |
1703 |
Cell *x; |
1688 |
int i, stat; |
1704 |
size_t i; |
|
|
1705 |
int stat; |
1689 |
|
1706 |
|
1690 |
n = n; |
1707 |
n = n; |
1691 |
x = execute(a[0]); |
1708 |
x = execute(a[0]); |
1692 |
getsval(x); |
1709 |
getsval(x); |
1693 |
stat = -1; |
1710 |
stat = -1; |
1694 |
for (i = 0; i < FOPEN_MAX; i++) { |
1711 |
for (i = 0; i < nfiles; i++) { |
1695 |
if (files[i].fname && strcmp(x->sval, files[i].fname) == 0) { |
1712 |
if (files[i].fname && strcmp(x->sval, files[i].fname) == 0) { |
1696 |
if (ferror(files[i].fp)) |
1713 |
if (ferror(files[i].fp)) |
1697 |
WARNING( "i/o error occurred on %s", files[i].fname ); |
1714 |
WARNING( "i/o error occurred on %s", files[i].fname ); |
Lines 1715-1723
Link Here
|
1715 |
|
1732 |
|
1716 |
void closeall(void) |
1733 |
void closeall(void) |
1717 |
{ |
1734 |
{ |
1718 |
int i, stat; |
1735 |
size_t i; |
|
|
1736 |
int stat; |
1719 |
|
1737 |
|
1720 |
for (i = 0; i < FOPEN_MAX; i++) { |
1738 |
for (i = 0; i < nfiles; i++) { |
1721 |
if (files[i].fp) { |
1739 |
if (files[i].fp) { |
1722 |
if (ferror(files[i].fp)) |
1740 |
if (ferror(files[i].fp)) |
1723 |
WARNING( "i/o error occurred on %s", files[i].fname ); |
1741 |
WARNING( "i/o error occurred on %s", files[i].fname ); |
Lines 1733-1741
Link Here
|
1733 |
|
1751 |
|
1734 |
void flush_all(void) |
1752 |
void flush_all(void) |
1735 |
{ |
1753 |
{ |
1736 |
int i; |
1754 |
size_t i; |
1737 |
|
1755 |
|
1738 |
for (i = 0; i < FOPEN_MAX; i++) |
1756 |
for (i = 0; i < nfiles; i++) |
1739 |
if (files[i].fp) |
1757 |
if (files[i].fp) |
1740 |
fflush(files[i].fp); |
1758 |
fflush(files[i].fp); |
1741 |
} |
1759 |
} |