/wrtfmt.c

https://github.com/neurodebian/pkg-xppaut · C · 255 lines · 248 code · 1 blank · 6 comment · 96 complexity · f110ec5f8c190e13813ee02ea08a0346 MD5 · raw file

  1. #include "err.h"
  2. #include "wrtfmt.h"
  3. #include "wref.h"
  4. /*#include <stdlib.h>
  5. #include "f2c.h"
  6. #include "fio.h"
  7. #include "fmt.h"
  8. */
  9. extern int cursor;
  10. extern char *icvt(), *ecvt();
  11. int hiwater;
  12. icilist *svic;
  13. char *icptr;
  14. int mv_cur() /* shouldn't use fseek because it insists on calling fflush */
  15. /* instead we know too much about stdio */
  16. {
  17. if(external == 0) {
  18. if(cursor < 0) {
  19. if(hiwater < recpos)
  20. hiwater = recpos;
  21. recpos += cursor;
  22. icptr += cursor;
  23. cursor = 0;
  24. if(recpos < 0)
  25. err(elist->cierr, 110, "left off");
  26. }
  27. else if(cursor > 0) {
  28. if(recpos + cursor >= svic->icirlen)
  29. err(elist->cierr, 110, "recend");
  30. if(hiwater <= recpos)
  31. for(; cursor > 0; cursor--)
  32. (*putn)(' ');
  33. else if(hiwater <= recpos + cursor) {
  34. cursor -= hiwater - recpos;
  35. icptr += hiwater - recpos;
  36. recpos = hiwater;
  37. for(; cursor > 0; cursor--)
  38. (*putn)(' ');
  39. }
  40. else {
  41. icptr += cursor;
  42. recpos += cursor;
  43. }
  44. cursor = 0;
  45. }
  46. return(0);
  47. }
  48. if(cursor > 0) {
  49. if(hiwater <= recpos)
  50. for(;cursor>0;cursor--) (*putn)(' ');
  51. else if(hiwater <= recpos + cursor) {
  52. #ifndef NON_UNIX_STDIO
  53. if(cf->_ptr + hiwater - recpos < buf_end(cf))
  54. cf->_ptr += hiwater - recpos;
  55. else
  56. #endif
  57. (void) fseek(cf, (int) (hiwater - recpos), 1);
  58. cursor -= hiwater - recpos;
  59. recpos = hiwater;
  60. for(; cursor > 0; cursor--)
  61. (*putn)(' ');
  62. }
  63. else {
  64. #ifndef NON_UNIX_STDIO
  65. if(cf->_ptr + cursor < buf_end(cf))
  66. cf->_ptr += cursor;
  67. else
  68. #endif
  69. (void) fseek(cf, (int)cursor, 1);
  70. recpos += cursor;
  71. }
  72. }
  73. if(cursor<0)
  74. {
  75. if(cursor+recpos<0) err(elist->cierr,110,"left off");
  76. #ifndef NON_UNIX_STDIO
  77. if(cf->_ptr + cursor >= cf->_base)
  78. cf->_ptr += cursor;
  79. else
  80. #endif
  81. if(curunit->useek) (void) fseek(cf,(int)cursor,1);
  82. else err(elist->cierr,106,"fmt");
  83. if(hiwater < recpos)
  84. hiwater = recpos;
  85. recpos += cursor;
  86. cursor=0;
  87. }
  88. return(0);
  89. }
  90. int w_ed(p,ptr,len) char *ptr; struct syl *p; ftnlen len;
  91. {
  92. if(cursor && mv_cur()) return(mv_cur());
  93. switch(p->op)
  94. {
  95. default:
  96. fprintf(stderr,"w_ed, unexpected code: %d\n%s\n",
  97. p->op,fmtbuf);
  98. abort();
  99. case I: return(wrt_I((Uint *)ptr,p->p1,len, 10));
  100. case IM:
  101. return(wrt_IM((Uint *)ptr,p->p1,p->p2,len));
  102. case O: return(wrt_I((Uint *)ptr, p->p1, len, 8));
  103. case L: return(wrt_L((Uint *)ptr,p->p1, len));
  104. case A: return(wrt_A(ptr,len));
  105. case AW:
  106. return(wrt_AW(ptr,p->p1,len));
  107. case D:
  108. case E:
  109. case EE:
  110. return(wrt_E((ufloat *)ptr,p->p1,p->p2,p->p3,len));
  111. case G:
  112. case GE:
  113. return(wrt_G((ufloat *)ptr,p->p1,p->p2,p->p3,len));
  114. case F: return(wrt_F((ufloat *)ptr,p->p1,p->p2,len));
  115. }
  116. }
  117. int w_ned(p) struct syl *p;
  118. {
  119. switch(p->op)
  120. {
  121. default: fprintf(stderr,"w_ned, unexpected code: %d\n%s\n",
  122. p->op,fmtbuf);
  123. abort();
  124. case SLASH:
  125. return((*donewrec)());
  126. case T: cursor = p->p1-recpos - 1;
  127. return(1);
  128. case TL: cursor -= p->p1;
  129. if(cursor < -recpos) /* TL1000, 1X */
  130. cursor = -recpos;
  131. return(1);
  132. case TR:
  133. case X:
  134. cursor += p->p1;
  135. return(1);
  136. case APOS:
  137. return(wrt_AP(*(char **)&p->p2));
  138. case H:
  139. return(wrt_H(p->p1,*(char **)&p->p2));
  140. }
  141. }
  142. int wrt_I(n,w,len, base) Uint *n; ftnlen len; register int base;int w;
  143. { int ndigit,sign,spare,i;
  144. int x;
  145. char *ans;
  146. if(len==sizeof(integer)) x=n->il;
  147. else if(len == sizeof(char)) x = n->ic;
  148. else x=n->is;
  149. ans=icvt(x,&ndigit,&sign, base);
  150. spare=w-ndigit;
  151. if(sign || cplus) spare--;
  152. if(spare<0)
  153. for(i=0;i<w;i++) (*putn)('*');
  154. else
  155. { for(i=0;i<spare;i++) (*putn)(' ');
  156. if(sign) (*putn)('-');
  157. else if(cplus) (*putn)('+');
  158. for(i=0;i<ndigit;i++) (*putn)(*ans++);
  159. }
  160. return(0);
  161. }
  162. int wrt_IM(n,w,m,len) Uint *n; ftnlen len;int w;int m;
  163. { int ndigit,sign,spare,i,xsign;
  164. int x;
  165. char *ans;
  166. if(sizeof(integer)==len) x=n->il;
  167. else if(len == sizeof(char)) x = n->ic;
  168. else x=n->is;
  169. ans=icvt(x,&ndigit,&sign, 10);
  170. if(sign || cplus) xsign=1;
  171. else xsign=0;
  172. if(ndigit+xsign>w || m+xsign>w)
  173. { for(i=0;i<w;i++) (*putn)('*');
  174. return(0);
  175. }
  176. if(x==0 && m==0)
  177. { for(i=0;i<w;i++) (*putn)(' ');
  178. return(0);
  179. }
  180. if(ndigit>=m)
  181. spare=w-ndigit-xsign;
  182. else
  183. spare=w-m-xsign;
  184. for(i=0;i<spare;i++) (*putn)(' ');
  185. if(sign) (*putn)('-');
  186. else if(cplus) (*putn)('+');
  187. for(i=0;i<m-ndigit;i++) (*putn)('0');
  188. for(i=0;i<ndigit;i++) (*putn)(*ans++);
  189. return(0);
  190. }
  191. int wrt_AP(s)
  192. char *s;
  193. { char quote;
  194. if(cursor && mv_cur()) return(mv_cur());
  195. quote = *s++;
  196. for(;*s;s++)
  197. { if(*s!=quote) (*putn)(*s);
  198. else if(*++s==quote) (*putn)(*s);
  199. else return(1);
  200. }
  201. return(1);
  202. }
  203. int wrt_H(a,s) int a;
  204. char *s;
  205. {
  206. if(cursor && mv_cur()) return(mv_cur());
  207. while(a--) (*putn)(*s++);
  208. return(1);
  209. }
  210. int wrt_L(n,len, sz) Uint *n; ftnlen sz;int len;
  211. { int i;
  212. int x;
  213. if(sizeof(integer)==sz) x=n->il;
  214. else if(sz == sizeof(char)) x = n->ic;
  215. else x=n->is;
  216. for(i=0;i<len-1;i++)
  217. (*putn)(' ');
  218. if(x) (*putn)('T');
  219. else (*putn)('F');
  220. return(0);
  221. }
  222. int wrt_A(p,len) char *p; ftnlen len;
  223. {
  224. while(len-- > 0) (*putn)(*p++);
  225. return(0);
  226. }
  227. int wrt_AW(p,w,len) char * p; ftnlen len;int w;
  228. {
  229. while(w>len)
  230. { w--;
  231. (*putn)(' ');
  232. }
  233. while(w-- > 0)
  234. (*putn)(*p++);
  235. return(0);
  236. }
  237. int wrt_G(p,w,d,e,len) ufloat *p; ftnlen len;int w;int d;int e;
  238. { double up = 1,x;
  239. int i,oldscale=scale,n,j;
  240. x= len==sizeof(real)?p->pf:p->pd;
  241. if(x < 0 ) x = -x;
  242. if(x<.1) return(wrt_E(p,w,d,e,len));
  243. for(i=0;i<=d;i++,up*=10)
  244. { if(x>=up) continue;
  245. scale=0;
  246. if(e==0) n=4;
  247. else n=e+2;
  248. i=wrt_F(p,w-n,d-i,len);
  249. for(j=0;j<n;j++) (*putn)(' ');
  250. scale=oldscale;
  251. return(i);
  252. }
  253. return(wrt_E(p,w,d,e,len));
  254. }