View | Details | Raw Unified | Return to bug 143368
Collapse All | Expand All

(-)contrib/one-true-awk/run.c (-19 / +37 lines)
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
}

Return to bug 143368