summaryrefslogtreecommitdiffstats
path: root/lib/libF77/s_catow.c
blob: 6dd641c0b8753b130188a2b4b141595ac5bcadd4 (plain)
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
/* Variant of s_cat that allows the target of a concatenation to */
/* appear on its right-hand side (contrary to the Fortran 77 Standard). */

#include "f2c.h"
#undef abs
#ifdef KR_headers
 extern char *malloc();
 extern void free();
#else
#include "stdlib.h"
#endif
#include "string.h"

 static VOID
#ifdef KR_headers
s_cat0(lp, rpp, rnp, n, ll) char *lp, *rpp[]; ftnlen rnp[], n, ll;
#else
s_cat0(char *lp, char *rpp[], ftnlen rnp[], ftnlen n, ftnlen ll)
#endif
{
	ftnlen i, nc;
	char *rp;

	for(i = 0 ; i < n ; ++i) {
		nc = ll;
		if(rnp[i] < nc)
			nc = rnp[i];
		ll -= nc;
		rp = rpp[i];
		while(--nc >= 0)
			*lp++ = *rp++;
		}
	while(--ll >= 0)
		*lp++ = ' ';
	}

 VOID
#ifdef KR_headers
s_cat(lp, rpp, rnp, np, ll) char *lp, *rpp[]; ftnlen rnp[], *np, ll;
#else
s_cat(char *lp, char *rpp[], ftnlen rnp[], ftnlen *np, ftnlen ll)
#endif
{
	ftnlen i, L, m, n;
	char *lpe, *rp;

	n = *np;
	lpe = lp;
	L = ll;
	i = 0;
	while(i < n) {
		rp = rpp[i];
		m = rnp[i++];
		if (rp >= lpe || rp + m <= lp) {
			if ((L -= m) <= 0) {
				n = i;
				break;
				}
			lpe += m;
			continue;
			}
		lpe = malloc(ll);
		s_cat0(lpe, rpp, rnp, n, ll);
		memcpy(lp, lpe, ll);
		free(lpe);
		return;
		}
	s_cat0(lp, rpp, rnp, n, ll);
	}
OpenPOWER on IntegriCloud