iom.pas 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. {
  2. This file is part of the Numlib package.
  3. Copyright (c) 1986-2000 by
  4. Kees van Ginneken, Wil Kortsmit and Loek van Reij of the
  5. Computational centre of the Eindhoven University of Technology
  6. FPC port Code by Marco van de Voort ([email protected])
  7. documentation by Michael van Canneyt ([email protected])
  8. Basic In and output of matrix and vector types. Maybe too simple for
  9. your application, but still handy for logging and debugging.
  10. See the file COPYING.FPC, included in this distribution,
  11. for details about the copyright.
  12. This program is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  15. **********************************************************************}
  16. {$IFNDEF FPC_DOTTEDUNITS}
  17. unit iom;
  18. {$ENDIF FPC_DOTTEDUNITS}
  19. interface
  20. {$I direct.inc}
  21. {$IFDEF FPC_DOTTEDUNITS}
  22. uses NumLib.Typ;
  23. {$ELSE FPC_DOTTEDUNITS}
  24. uses typ;
  25. {$ENDIF FPC_DOTTEDUNITS}
  26. const
  27. npos : ArbInt = 78;
  28. {Read a n-dimensional vector v from textfile}
  29. procedure iomrev(var inp: text; var v: ArbFloat; n: ArbInt);
  30. {Read a m x n-dimensional matrix a from textfile}
  31. procedure iomrem(var inp: text; var a: ArbFloat; m, n, rwidth: ArbInt);
  32. {Write a n-dimensional vectorv v to textfile}
  33. procedure iomwrv(var out: text; var v: ArbFloat; n, form: ArbInt);
  34. {Write a m x n-dimensional matrix a to textfile}
  35. procedure iomwrm(var out: text; var a: ArbFloat; m, n, rwidth, form: ArbInt);
  36. {Read a m x n-dimensional matrix a from string}
  37. procedure iomrems(inp: ArbString; var a: ArbFloat; var m, n: ArbInt; c: ArbInt);
  38. {Write a m x n-dimensional matrix a to string}
  39. procedure iomwrms(var out: ArbString; var a: ArbFloat; m, n, form, c: ArbInt);
  40. implementation
  41. procedure iomrev(var inp: text; var v: ArbFloat; n: ArbInt);
  42. var pv : ^arfloat1;
  43. i : ArbInt;
  44. BEGIN
  45. pv:=@v; for i:=1 to n do read(inp, pv^[i])
  46. END {iomrev};
  47. procedure iomrem(var inp: text; var a: ArbFloat; m, n, rwidth: ArbInt);
  48. var pa : ^arfloat1;
  49. i, k : ArbInt;
  50. BEGIN
  51. pa:=@a; k:=1;
  52. for i:=1 to m do
  53. BEGIN
  54. iomrev(inp, pa^[k], n); Inc(k, rwidth)
  55. END
  56. END {iomrem};
  57. procedure iomwrv(var out: text; var v: ArbFloat; n, form: ArbInt);
  58. var pv : arfloat1 absolute v;
  59. i, i1 : ArbInt;
  60. BEGIN
  61. if form>maxform then form:=maxform else
  62. if form<minform then form:=minform;
  63. i1:=npos div (form+2);
  64. for i:=1 to n do
  65. if ((i mod i1)=0) or (i=n) then writeln(out, pv[i]:form)
  66. else write(out, pv[i]:form, '':2)
  67. END {iomwrv};
  68. procedure iomwrm(var out: text; var a: ArbFloat; m, n, rwidth, form: ArbInt);
  69. var pa : ^arfloat1;
  70. i, k, nb, i1, l, j, r, l1, kk : ArbInt;
  71. BEGIN
  72. if (n<1) or (m<1) then exit;
  73. pa:=@a;
  74. if form>maxform then form:=maxform else
  75. if form<minform then form:=minform;
  76. i1:=npos div (form+2); l1:=0;
  77. nb:=n div i1; r:=n mod i1;
  78. if r>0 then Inc(nb);
  79. for l:=1 to nb do
  80. BEGIN
  81. k:=l1+1; if (r>0) and (l=nb) then i1:=r;
  82. for i:=1 to m do
  83. BEGIN
  84. kk:=k;
  85. for j:=1 to i1-1 do
  86. BEGIN
  87. write(out, pa^[kk]:form, '':2); Inc(kk)
  88. END;
  89. writeln(out, pa^[kk]:form); Inc(k, rwidth)
  90. END;
  91. Inc(l1, i1); if l<nb then writeln(out)
  92. END;
  93. END {iomwrm};
  94. procedure iomrems(inp: ArbString; var a: ArbFloat; var m, n: ArbInt; c: ArbInt);
  95. var
  96. pa: ^arfloat1;
  97. i, k: ArbInt;
  98. err: ArbInt;
  99. s: ArbString;
  100. ni: ArbInt;
  101. ci: ArbInt;
  102. begin
  103. pa:=@a;
  104. k:=1;
  105. m:=0;
  106. n:=0;
  107. //parse the text
  108. i:= 1;
  109. while i < Length(inp) do
  110. begin
  111. ni := 1;
  112. ci := 1;
  113. //parse row
  114. while not (inp[i] in ['}']) do
  115. begin
  116. //go to beginning of row values
  117. while inp[i] in ['{',' '] do
  118. begin
  119. //increase row counter
  120. if inp[i] = '{' then
  121. Inc(m);
  122. Inc(i);
  123. end;
  124. //get value from string
  125. s := '';
  126. while inp[i] in ['0'..'9','E','e','+','-'] do
  127. begin
  128. s := s + inp[i];
  129. Inc(i);
  130. end;
  131. //assign value to element
  132. val(s, pa^[k], err);
  133. Inc(k);
  134. if err <> 0 then
  135. writeln('Val(',s,') failed at position ', err);
  136. Inc(ci);
  137. end;
  138. k := ((k div c) + 1) * c + 1;
  139. Inc(ni);
  140. if ni > n then n := ni;
  141. Inc(i);
  142. end;
  143. end;
  144. procedure iomwrms(var out: ArbString; var a: ArbFloat; m, n, form, c: ArbInt);
  145. var
  146. pa: ^arfloat1;
  147. i, l, kk: ArbInt;
  148. s: ShortString;
  149. BEGIN
  150. if (n<1) or (m<1) then
  151. exit;
  152. pa:=@a;
  153. if form>maxform then
  154. form:=maxform
  155. else
  156. if form<minform then
  157. form:=minform;
  158. kk := 1;
  159. for l:=1 to m do
  160. BEGIN
  161. out := out + '{';
  162. for i:=1 to n do
  163. BEGIN
  164. str(pa^[kk]:form, s);
  165. Inc(kk);
  166. if i <> n then
  167. out := out + s + ' '
  168. else
  169. out := out + s;
  170. END;
  171. kk := ((kk div c) + 1) * c + 1;
  172. out := out + ' }';
  173. end;
  174. end;
  175. END.