/externals/netlib/dctemplates/F2CLIBS/libI77/wrtfmt.c

https://github.com/siconos/siconos · C · 416 lines · 403 code · 7 blank · 6 comment · 123 complexity · dda0d666aa3b8ad03323b7fae456cd31 MD5 · raw file

  1. #include "f2c.h"
  2. #include "fio.h"
  3. #include "fmt.h"
  4. extern int f__cursor;
  5. #ifdef KR_headers
  6. extern char *f__icvt();
  7. #else
  8. extern char *f__icvt(long, int*, int*, int);
  9. #endif
  10. int f__hiwater;
  11. icilist *f__svic;
  12. char *f__icptr;
  13. mv_cur(Void) /* shouldn't use fseek because it insists on calling fflush */
  14. /* instead we know too much about stdio */
  15. {
  16. if(f__external == 0)
  17. {
  18. if(f__cursor < 0)
  19. {
  20. if(f__hiwater < f__recpos)
  21. f__hiwater = f__recpos;
  22. f__recpos += f__cursor;
  23. f__icptr += f__cursor;
  24. f__cursor = 0;
  25. if(f__recpos < 0)
  26. err(f__elist->cierr, 110, "left off");
  27. }
  28. else if(f__cursor > 0)
  29. {
  30. if(f__recpos + f__cursor >= f__svic->icirlen)
  31. err(f__elist->cierr, 110, "recend");
  32. if(f__hiwater <= f__recpos)
  33. for(; f__cursor > 0; f__cursor--)
  34. (*f__putn)(' ');
  35. else if(f__hiwater <= f__recpos + f__cursor)
  36. {
  37. f__cursor -= f__hiwater - f__recpos;
  38. f__icptr += f__hiwater - f__recpos;
  39. f__recpos = f__hiwater;
  40. for(; f__cursor > 0; f__cursor--)
  41. (*f__putn)(' ');
  42. }
  43. else
  44. {
  45. f__icptr += f__cursor;
  46. f__recpos += f__cursor;
  47. }
  48. f__cursor = 0;
  49. }
  50. return(0);
  51. }
  52. if(f__cursor > 0)
  53. {
  54. if(f__hiwater <= f__recpos)
  55. for(; f__cursor > 0; f__cursor--)(*f__putn)(' ');
  56. else if(f__hiwater <= f__recpos + f__cursor)
  57. {
  58. #ifndef NON_UNIX_STDIO
  59. if(f__cf->_ptr + f__hiwater - f__recpos < buf_end(f__cf))
  60. f__cf->_ptr += f__hiwater - f__recpos;
  61. else
  62. #endif
  63. (void) fseek(f__cf, (long)(f__hiwater - f__recpos), SEEK_CUR);
  64. f__cursor -= f__hiwater - f__recpos;
  65. f__recpos = f__hiwater;
  66. for(; f__cursor > 0; f__cursor--)
  67. (*f__putn)(' ');
  68. }
  69. else
  70. {
  71. #ifndef NON_UNIX_STDIO
  72. if(f__cf->_ptr + f__cursor < buf_end(f__cf))
  73. f__cf->_ptr += f__cursor;
  74. else
  75. #endif
  76. (void) fseek(f__cf, (long)f__cursor, SEEK_CUR);
  77. f__recpos += f__cursor;
  78. }
  79. }
  80. if(f__cursor < 0)
  81. {
  82. if(f__cursor + f__recpos < 0) err(f__elist->cierr, 110, "left off");
  83. #ifndef NON_UNIX_STDIO
  84. if(f__cf->_ptr + f__cursor >= f__cf->_base)
  85. f__cf->_ptr += f__cursor;
  86. else
  87. #endif
  88. if(f__curunit && f__curunit->useek)
  89. (void) fseek(f__cf, (long)f__cursor, SEEK_CUR);
  90. else
  91. err(f__elist->cierr, 106, "fmt");
  92. if(f__hiwater < f__recpos)
  93. f__hiwater = f__recpos;
  94. f__recpos += f__cursor;
  95. f__cursor = 0;
  96. }
  97. return(0);
  98. }
  99. static int
  100. #ifdef KR_headers
  101. wrt_Z(n, w, minlen, len) Uint *n;
  102. int w, minlen;
  103. ftnlen len;
  104. #else
  105. wrt_Z(Uint *n, int w, int minlen, ftnlen len)
  106. #endif
  107. {
  108. register char *s, *se;
  109. register i, w1;
  110. static int one = 1;
  111. static char hex[] = "0123456789ABCDEF";
  112. s = (char *)n;
  113. --len;
  114. if(*(char *)&one)
  115. {
  116. /* little endian */
  117. se = s;
  118. s += len;
  119. i = -1;
  120. }
  121. else
  122. {
  123. se = s + len;
  124. i = 1;
  125. }
  126. for(;; s += i)
  127. if(s == se || *s)
  128. break;
  129. w1 = (i * (se - s) << 1) + 1;
  130. if(*s & 0xf0)
  131. w1++;
  132. if(w1 > w)
  133. for(i = 0; i < w; i++)
  134. (*f__putn)('*');
  135. else
  136. {
  137. if((minlen -= w1) > 0)
  138. w1 += minlen;
  139. while(--w >= w1)
  140. (*f__putn)(' ');
  141. while(--minlen >= 0)
  142. (*f__putn)('0');
  143. if(!(*s & 0xf0))
  144. {
  145. (*f__putn)(hex[*s & 0xf]);
  146. if(s == se)
  147. return 0;
  148. s += i;
  149. }
  150. for(;; s += i)
  151. {
  152. (*f__putn)(hex[*s >> 4 & 0xf]);
  153. (*f__putn)(hex[*s & 0xf]);
  154. if(s == se)
  155. break;
  156. }
  157. }
  158. return 0;
  159. }
  160. static int
  161. #ifdef KR_headers
  162. wrt_I(n, w, len, base) Uint *n;
  163. ftnlen len;
  164. register int base;
  165. #else
  166. wrt_I(Uint *n, int w, ftnlen len, register int base)
  167. #endif
  168. {
  169. int ndigit, sign, spare, i;
  170. long x;
  171. char *ans;
  172. if(len == sizeof(integer)) x = n->il;
  173. else if(len == sizeof(char)) x = n->ic;
  174. #ifdef Allow_TYQUAD
  175. else if(len == sizeof(longint)) x = n->ili;
  176. #endif
  177. else x = n->is;
  178. ans = f__icvt(x, &ndigit, &sign, base);
  179. spare = w - ndigit;
  180. if(sign || f__cplus) spare--;
  181. if(spare < 0)
  182. for(i = 0; i < w; i++)(*f__putn)('*');
  183. else
  184. {
  185. for(i = 0; i < spare; i++)(*f__putn)(' ');
  186. if(sign)(*f__putn)('-');
  187. else if(f__cplus)(*f__putn)('+');
  188. for(i = 0; i < ndigit; i++)(*f__putn)(*ans++);
  189. }
  190. return(0);
  191. }
  192. static int
  193. #ifdef KR_headers
  194. wrt_IM(n, w, m, len, base) Uint *n;
  195. ftnlen len;
  196. int base;
  197. #else
  198. wrt_IM(Uint *n, int w, int m, ftnlen len, int base)
  199. #endif
  200. {
  201. int ndigit, sign, spare, i, xsign;
  202. long x;
  203. char *ans;
  204. if(sizeof(integer) == len) x = n->il;
  205. else if(len == sizeof(char)) x = n->ic;
  206. else x = n->is;
  207. ans = f__icvt(x, &ndigit, &sign, base);
  208. if(sign || f__cplus) xsign = 1;
  209. else xsign = 0;
  210. if(ndigit + xsign > w || m + xsign > w)
  211. {
  212. for(i = 0; i < w; i++)(*f__putn)('*');
  213. return(0);
  214. }
  215. if(x == 0 && m == 0)
  216. {
  217. for(i = 0; i < w; i++)(*f__putn)(' ');
  218. return(0);
  219. }
  220. if(ndigit >= m)
  221. spare = w - ndigit - xsign;
  222. else
  223. spare = w - m - xsign;
  224. for(i = 0; i < spare; i++)(*f__putn)(' ');
  225. if(sign)(*f__putn)('-');
  226. else if(f__cplus)(*f__putn)('+');
  227. for(i = 0; i < m - ndigit; i++)(*f__putn)('0');
  228. for(i = 0; i < ndigit; i++)(*f__putn)(*ans++);
  229. return(0);
  230. }
  231. static int
  232. #ifdef KR_headers
  233. wrt_AP(s) char *s;
  234. #else
  235. wrt_AP(char *s)
  236. #endif
  237. {
  238. char quote;
  239. if(f__cursor && mv_cur()) return(mv_cur());
  240. quote = *s++;
  241. for(; *s; s++)
  242. {
  243. if(*s != quote)(*f__putn)(*s);
  244. else if(*++s == quote)(*f__putn)(*s);
  245. else return(1);
  246. }
  247. return(1);
  248. }
  249. static int
  250. #ifdef KR_headers
  251. wrt_H(a, s) char *s;
  252. #else
  253. wrt_H(int a, char *s)
  254. #endif
  255. {
  256. if(f__cursor && mv_cur()) return(mv_cur());
  257. while(a--)(*f__putn)(*s++);
  258. return(1);
  259. }
  260. #ifdef KR_headers
  261. wrt_L(n, len, sz) Uint *n;
  262. ftnlen sz;
  263. #else
  264. wrt_L(Uint *n, int len, ftnlen sz)
  265. #endif
  266. {
  267. int i;
  268. long x;
  269. if(sizeof(long) == sz) x = n->il;
  270. else if(sz == sizeof(char)) x = n->ic;
  271. else x = n->is;
  272. for(i = 0; i < len - 1; i++)
  273. (*f__putn)(' ');
  274. if(x)(*f__putn)('T');
  275. else(*f__putn)('F');
  276. return(0);
  277. }
  278. static int
  279. #ifdef KR_headers
  280. wrt_A(p, len) char *p;
  281. ftnlen len;
  282. #else
  283. wrt_A(char *p, ftnlen len)
  284. #endif
  285. {
  286. while(len-- > 0)(*f__putn)(*p++);
  287. return(0);
  288. }
  289. static int
  290. #ifdef KR_headers
  291. wrt_AW(p, w, len) char * p;
  292. ftnlen len;
  293. #else
  294. wrt_AW(char * p, int w, ftnlen len)
  295. #endif
  296. {
  297. while(w > len)
  298. {
  299. w--;
  300. (*f__putn)(' ');
  301. }
  302. while(w-- > 0)
  303. (*f__putn)(*p++);
  304. return(0);
  305. }
  306. static int
  307. #ifdef KR_headers
  308. wrt_G(p, w, d, e, len) ufloat *p;
  309. ftnlen len;
  310. #else
  311. wrt_G(ufloat *p, int w, int d, int e, ftnlen len)
  312. #endif
  313. {
  314. double up = 1, x;
  315. int i, oldscale = f__scale, n, j;
  316. x = len == sizeof(real) ? p->pf : p->pd;
  317. if(x < 0) x = -x;
  318. if(x < .1) return(wrt_E(p, w, d, e, len));
  319. for(i = 0; i <= d; i++, up *= 10)
  320. {
  321. if(x >= up) continue;
  322. f__scale = 0;
  323. if(e == 0) n = 4;
  324. else n = e + 2;
  325. i = wrt_F(p, w - n, d - i, len);
  326. for(j = 0; j < n; j++)(*f__putn)(' ');
  327. f__scale = oldscale;
  328. return(i);
  329. }
  330. return(wrt_E(p, w, d, e, len));
  331. }
  332. #ifdef KR_headers
  333. w_ed(p, ptr, len) struct f__syl *p;
  334. char *ptr;
  335. ftnlen len;
  336. #else
  337. w_ed(struct f__syl *p, char *ptr, ftnlen len)
  338. #endif
  339. {
  340. if(f__cursor && mv_cur()) return(mv_cur());
  341. switch(p->op)
  342. {
  343. default:
  344. fprintf(stderr, "w_ed, unexpected code: %d\n", p->op);
  345. sig_die(f__fmtbuf, 1);
  346. case I:
  347. return(wrt_I((Uint *)ptr, p->p1, len, 10));
  348. case IM:
  349. return(wrt_IM((Uint *)ptr, p->p1, p->p2, len, 10));
  350. /* O and OM don't work right for character, double, complex, */
  351. /* or doublecomplex, and they differ from Fortran 90 in */
  352. /* showing a minus sign for negative values. */
  353. case O:
  354. return(wrt_I((Uint *)ptr, p->p1, len, 8));
  355. case OM:
  356. return(wrt_IM((Uint *)ptr, p->p1, p->p2, len, 8));
  357. case L:
  358. return(wrt_L((Uint *)ptr, p->p1, len));
  359. case A:
  360. return(wrt_A(ptr, len));
  361. case AW:
  362. return(wrt_AW(ptr, p->p1, len));
  363. case D:
  364. case E:
  365. case EE:
  366. return(wrt_E((ufloat *)ptr, p->p1, p->p2, p->p3, len));
  367. case G:
  368. case GE:
  369. return(wrt_G((ufloat *)ptr, p->p1, p->p2, p->p3, len));
  370. case F:
  371. return(wrt_F((ufloat *)ptr, p->p1, p->p2, len));
  372. /* Z and ZM assume 8-bit bytes. */
  373. case Z:
  374. return(wrt_Z((Uint *)ptr, p->p1, 0, len));
  375. case ZM:
  376. return(wrt_Z((Uint *)ptr, p->p1, p->p2, len));
  377. }
  378. }
  379. #ifdef KR_headers
  380. w_ned(p) struct f__syl *p;
  381. #else
  382. w_ned(struct f__syl *p)
  383. #endif
  384. {
  385. switch(p->op)
  386. {
  387. default:
  388. fprintf(stderr, "w_ned, unexpected code: %d\n", p->op);
  389. sig_die(f__fmtbuf, 1);
  390. case SLASH:
  391. return((*f__donewrec)());
  392. case T:
  393. f__cursor = p->p1 - f__recpos - 1;
  394. return(1);
  395. case TL:
  396. f__cursor -= p->p1;
  397. if(f__cursor < -f__recpos) /* TL1000, 1X */
  398. f__cursor = -f__recpos;
  399. return(1);
  400. case TR:
  401. case X:
  402. f__cursor += p->p1;
  403. return(1);
  404. case APOS:
  405. return(wrt_AP(*(char **)&p->p2));
  406. case H:
  407. return(wrt_H(p->p1, *(char **)&p->p2));
  408. }
  409. }