home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume10 / crc_plot / part06 < prev    next >
Encoding:
Internet Message Format  |  1987-07-07  |  55.3 KB

  1. Path: uunet!rs
  2. From: rs@uunet.UU.NET (Rich Salz)
  3. Newsgroups: comp.sources.unix
  4. Subject: v10i050:  CRC Plotting Package, Part06/06
  5. Message-ID: <609@uunet.UU.NET>
  6. Date: 9 Jul 87 01:14:50 GMT
  7. Organization: UUNET Communications Services, Arlington, VA
  8. Lines: 2291
  9. Approved: rs@uunet.UU.NET
  10.  
  11. Submitted-by: "Wombat" <rsk@j.cc.purdue.edu>
  12. Posting-Number: Volume 10, Issue 50
  13. Archive-name: crc_plot/Part06
  14.  
  15.  
  16.  
  17. #    This is a shell archive.
  18. #    Remove everything above and including the cut line.
  19. #    Then run the rest of the file through sh.
  20. #----cut here-----cut here-----cut here-----cut here----#
  21. #!/bin/sh
  22. # shar:    Shell Archiver
  23. #    Run the following text with /bin/sh to create:
  24. #    src
  25. mkdir src
  26. chdir src
  27. cat << \SHAR_EOF > ifont.5x7
  28. 7
  29. \010/-6,0,0
  30. \011/55,0,0
  31. \040/6,0,0
  32. \041/2,6,0/2,2,1/2,0,0/2,0,1/6,0,0
  33. \042/1,6,0/1,4,1/3,6,0/3,4,1/6,0,0
  34. \043/1,0,0/1,6,1/3,6,0/3,0,1/4,2,0/0,2,1/0,4,0/4,4,1/6,0,0
  35. \044/0,1,0/3,1,1/4,2,1/3,3,1/1,3,1/0,4,1/1,5,1/4,5,1/2,6,0/2,0,1/6,0,0
  36. \045/0,1,0/4,5,1/1,5,0/0,5,1/0,6,1/1,6,1/1,5,1/3,1,0/4,1,1/4,0,1/3,0,1/3,1,1/6,0,0
  37. \046/4,0,0/0,4,1/0,5,1/1,6,1/2,5,1/2,4,1/0,2,1/0,1,1/1,0,1/2,0,1/4,2,1/6,0,0
  38. \047/2,6,0/2,4,1/6,0,0
  39. \050/3,0,0/1,2,1/1,4,1/3,6,1/6,0,0
  40. \051/1,0,0/3,2,1/3,4,1/1,6,1/6,0,0
  41. \052/2,0,0/2,6,1/0,5,0/4,1,1/0,1,0/4,5,1/6,0,0
  42. \053/2,1,0/2,5,1/0,3,0/4,3,1/6,0,0
  43. \054/1,0,0/2,1,1/2,2,1/6,0,0
  44. \055/0,3,0/4,3,1/6,0,0
  45. \056/2,0,0/2,0,1/6,0,0
  46. \057/0,1,0/4,5,1/6,0,0
  47. \060/0,1,0/0,5,1/1,6,1/2,6,1/3,5,1/3,1,1/2,0,1/1,0,1/0,1,1/6,0,0
  48. \061/1,0,0/3,0,1/2,0,1/2,6,1/1,5,1/6,0,0
  49. \062/0,5,0/1,6,1/3,6,1/4,5,1/4,4,1/3,3,1/1,3,1/0,2,1/0,0,1/4,0,1/6,0,0
  50. \063/0,1,0/1,0,1/3,0,1/4,1,1/4,2,1/3,3,1/2,3,1/3,3,1/4,4,1/4,5,1/3,6,1/1,6,1/0,5,1/6,0,0
  51. \064/0,6,0/0,3,1/4,3,1/3,6,0/3,0,1/6,0,0
  52. \065/0,1,0/1,0,1/3,0,1/4,1,1/4,3,1/3,4,1/0,4,1/0,6,1/4,6,1/6,0,0
  53. \066/3,6,0/2,6,1/0,4,1/0,1,1/1,0,1/3,0,1/4,1,1/4,2,1/3,3,1/0,3,1/6,0,0
  54. \067/0,6,0/4,6,1/4,5,1/1,2,1/1,0,1/6,0,0
  55. \070/1,3,0/0,4,1/0,5,1/1,6,1/3,6,1/4,5,1/4,4,1/3,3,1/1,3,1/3,3,1/4,2,1/4,1,1/3,0,1/1,0,1/0,1,1/0,2,1/1,3,1/6,0,0
  56. \071/1,0,0/2,0,1/4,2,1/4,3,1/1,3,1/0,4,1/0,5,1/1,6,1/3,6,1/4,5,1/4,3,1/6,0,0
  57. \072/2,2,0/2,2,1/2,4,0/2,4,1/6,0,0
  58. \073/1,0,0/2,1,1/2,2,1/2,4,0/2,4,1/6,0,0
  59. \074/3,0,0/0,3,1/3,6,1/6,0,0
  60. \075/0,2,0/4,2,1/4,4,0/0,4,1/6,0,0
  61. \076/3,3,1/0,6,1/6,0,0
  62. \077/2,0,0/2,0,1/2,2,0/2,3,1/4,5,1/3,6,1/1,6,1/0,5,1/6,0,0
  63. \100/2,2,0/2,4,1/1,3,1/2,2,1/3,2,1/4,3,1/4,5,1/3,6,1/1,6,1/0,5,1/0,1,1/1,0,1/3,0,1/4,1,1/6,0,0
  64. \101/0,4,1/2,6,1/4,4,1/4,0,1/0,2,0/4,2,1/6,0,0
  65. \102/3,0,1/4,1,1/4,2,1/3,3,1/1,3,1/3,3,1/4,4,1/4,5,1/3,6,1/0,6,1/1,6,1/1,0,1/6,0,0
  66. \103/4,1,0/3,0,1/1,0,1/0,1,1/0,5,1/1,6,1/3,6,1/4,5,1/6,0,0
  67. \104/3,0,1/4,1,1/4,5,1/3,6,1/0,6,1/1,6,1/1,0,1/6,0,0
  68. \105/4,0,0/0,0,1/0,3,1/2,3,1/0,3,1/0,6,1/4,6,1/6,0,0
  69. \106/0,3,1/2,3,1/0,3,1/0,6,1/4,6,1/6,0,0
  70. \107/3,3,0/4,3,1/4,0,1/1,0,1/0,1,1/0,5,1/1,6,1/4,6,1/6,0,0
  71. \110/0,6,1/4,6,0/4,0,1/0,3,0/4,3,1/6,0,0
  72. \111/1,0,0/3,0,1/2,0,1/2,6,1/1,6,1/3,6,1/6,0,0
  73. \112/0,1,0/1,0,1/3,0,1/4,1,1/4,6,1/6,0,0
  74. \113/0,6,1/4,6,0/0,2,1/1,3,0/4,0,1/6,0,0
  75. \114/0,6,0/0,0,1/4,0,1/6,0,0
  76. \115/0,6,1/2,4,1/2,3,1/2,4,1/4,6,1/4,0,1/6,0,0
  77. \116/0,6,1/4,2,1/4,0,1/4,6,1/6,0,0
  78. \117/1,0,0/3,0,1/4,1,1/4,5,1/3,6,1/1,6,1/0,5,1/0,1,1/1,0,1/6,0,0
  79. \120/0,6,1/3,6,1/4,5,1/4,4,1/3,3,1/0,3,1/6,0,0
  80. \121/0,1,0/0,5,1/1,6,1/3,6,1/4,5,1/4,1,1/3,0,1/1,0,1/0,1,1/2,2,0/4,0,1/6,0,0
  81. \122/0,6,1/3,6,1/4,5,1/4,4,1/3,3,1/0,3,1/1,3,1/4,0,1/6,0,0
  82. \123/0,1,0/1,0,1/3,0,1/4,1,1/4,2,1/3,3,1/1,3,1/0,4,1/0,5,1/1,6,1/3,6,1/4,5,1/6,0,0
  83. \124/2,0,0/2,6,1/0,6,1/4,6,1/6,0,0
  84. \125/0,6,0/0,1,1/1,0,1/3,0,1/4,1,1/4,6,1/6,0,0
  85. \126/0,6,0/0,2,1/2,0,1/4,2,1/4,6,1/6,0,0
  86. \127/0,6,0/0,0,1/2,2,1/2,3,1/2,2,1/4,0,1/4,6,1/6,0,0
  87. \130/0,1,1/4,5,1/4,6,1/0,6,0/0,5,1/4,1,1/4,0,1/6,0,0
  88. \131/0,6,0/0,5,1/2,3,1/2,0,1/2,3,1/4,5,1/4,6,1/6,0,0
  89. \132/0,6,0/4,6,1/4,5,1/0,1,1/0,0,1/4,0,1/6,0,0
  90. \133/3,0,0/0,0,1/0,6,1/3,6,1/6,0,0
  91. \134/0,5,0/4,1,1/6,0,0
  92. \135/3,0,1/3,6,1/0,6,1/6,0,0
  93. \136/2,2,1/4,0,1/6,0,0
  94. \137/0,-1,0/4,-1,1/6,0,0
  95. \140/1,6,0/3,4,1/6,0,0
  96. \141/1,0,0/4,0,1/4,3,1/3,4,1/1,4,1/4,2,0/1,2,1/0,1,1/1,0,1/6,0,0
  97. \142/0,6,1/0,4,0/3,4,1/4,3,1/4,1,1/3,0,1/0,0,1/6,0,0
  98. \143/4,4,0/1,4,1/0,3,1/0,1,1/1,0,1/4,0,1/6,0,0
  99. \144/1,0,0/4,0,1/4,6,1/4,4,0/1,4,1/0,3,1/0,1,1/1,0,1/6,0,0
  100. \145/3,0,0/1,0,1/0,1,1/0,3,1/1,4,1/3,4,1/4,3,1/4,2,1/0,2,1/6,0,0
  101. \146/1,0,0/1,5,1/2,6,1/3,5,1/0,3,0/2,3,1/6,0,0
  102. \147/2,-2,0/3,-2,1/4,-1,1/4,4,1/1,4,1/0,3,1/0,1,1/1,0,1/4,0,1/6,0,0
  103. \150/0,6,1/0,4,0/3,4,1/4,3,1/4,0,1/6,0,0
  104. \151/1,0,0/3,0,1/2,0,0/2,4,1/1,4,1/2,6,0/2,6,1/6,0,0
  105. \152/0,-1,0/1,-2,1/2,0,1/2,4,1/2,6,0/2,6,1/6,0,0
  106. \153/0,6,1/3,4,0/0,1,1/1,2,0/3,0,1/6,0,0
  107. \154/1,0,0/3,0,1/2,0,0/2,6,1/1,6,1/6,0,0
  108. \155/0,3,1/1,4,1/2,3,1/2,0,1/2,3,0/3,4,1/4,3,1/4,0,1/6,0,0
  109. \156/0,4,1/3,4,1/4,3,1/4,0,1/6,0,0
  110. \157/1,0,0/3,0,1/4,1,1/4,3,1/3,4,1/1,4,1/0,3,1/0,1,1/1,0,1/6,0,0
  111. \160/0,-2,0/0,4,1/3,4,1/4,3,1/4,1,1/3,0,1/0,0,1/6,0,0
  112. \161/4,0,0/1,0,1/0,1,1/0,3,1/1,4,1/4,4,1/4,-2,1/6,0,0
  113. \162/0,4,1/0,2,0/2,4,1/3,4,1/6,0,0
  114. \163/3,0,1/4,1,1/3,2,1/1,2,1/0,3,1/1,4,1/4,4,1/6,0,0
  115. \164/0,4,0/2,4,1/1,5,0/1,1,1/2,0,1/3,1,1/6,0,0
  116. \165/0,4,0/0,1,1/1,0,1/4,0,1/4,4,1/6,0,0
  117. \166/0,4,0/0,2,1/2,0,1/4,2,1/4,4,1/6,0,0
  118. \167/0,4,0/0,1,1/1,0,1/2,1,1/3,0,1/4,1,1/4,4,1/6,0,0
  119. \170/4,4,1/0,4,0/4,0,1/6,0,0
  120. \171/0,4,0/0,1,1/1,0,1/4,0,1/2,-2,0/3,-2,1/4,-1,1/4,4,1/6,0,0
  121. \172/0,4,0/4,4,1/0,0,1/4,0,1/6,0,0
  122. \173/3,0,0/2,1,1/2,2,1/1,3,1/2,4,1/2,5,1/3,6,1/6,0,0
  123. \174/2,0,0/2,6,1/6,0,0
  124. \175/1,0,0/2,1,1/2,2,1/3,3,1/2,4,1/2,5,1/1,6,1/6,0,0
  125. \176/0,4,0/1,5,1/3,3,1/4,4,1/6,0,0
  126. \210/-6,0,0
  127. \211/55,0,0
  128. \240/3,0,0
  129. \241/0,2,0/2,0,1/4,8,1/6,8,1/6,0,0
  130. \242/1,6,0/1,4,1/3,6,0/3,4,1/6,0,0
  131. \243/0,1,0/4,1,1/4,3,0/0,3,1/2,5,0/2,5,1/6,0,0
  132. \244/0,1,0/3,1,1/4,2,1/3,3,1/1,3,1/0,4,1/1,5,1/4,5,1/2,6,0/2,0,1/6,0,0
  133. \245/0,2,0/4,2,1/4,4,0/0,4,1/1,0,0/3,6,1/6,0,0
  134. \246/0,6,0/1,6,1/1,5,1/0,4,1/0,1,1/1,0,1/3,0,1/4,1,1/4,4,1/3,5,1/3,6,1/4,6,1/6,0,0
  135. \247/1,5,0/2,4,1/3,5,1/2,6,1/1,5,1/6,0,0
  136. \250/3,0,0/1,2,1/1,4,1/3,6,1/6,0,0
  137. \251/1,0,0/3,2,1/3,4,1/1,6,1/6,0,0
  138. \252/-3,-3,0/3,3,1/0,0,1/-3,3,1/3,-3,1/0,0,1/-3,0,1/3,0,1/0,0,1/0,3,1/0,-3,1/8,0,0
  139. \253/0,-3,0/0,3,1/0,0,1/-3,0,1/3,0,1/8,0,0
  140. \254/0,2,0/2,0,1/0,-2,1/-2,0,1/0,2,1/8,0,0
  141. \255/0,1,0/4,1,1/0,4,0/4,4,1/2,6,0/2,2,1/6,0,0
  142. \256/2,0,0/3,0,1/3,1,1/2,1,1/2,0,1/6,0,0
  143. \257/0,3,0/4,3,1/2,5,0/2,5,1/2,1,0/2,1,1/6,0,0
  144. \260/-3,-3,0/3,-3,1/3,3,1/-3,3,1/-3,-3,1/0,0,0/0,3,1/8,0,0
  145. \261/0,3,1/1,3,1/3,1,1/3,-1,1/1,-3,1/-1,-3,1/-3,-1,1/-3,1,1/-1,3,1/0,3,1/8,0,0
  146. \262/0,3,1/3,-2,1/-3,-2,1/0,3,1/8,0,0
  147. \263/3,3,1/0,0,0/-3,3,1/0,0,0/0,-3,1/8,0,0
  148. \264/-3,-3,0/3,3,1/3,-3,0/-3,3,1/8,0,0
  149. \265/0,3,1/3,0,1/0,-3,1/-3,0,1/0,3,1/8,0,0
  150. \266/0,-3,0/0,3,1/3,0,1/-3,0,1/0,3,1/8,0,0
  151. \267/-3,-3,0/3,3,1/-3,3,1/3,-3,1/-3,-3,1/8,0,0
  152. \270/-3,3,0/3,3,1/-3,-3,1/3,-3,1/8,0,0
  153. \271/3,3,1/2,2,1/2,-2,1/3,-3,1/2,-2,1/-2,-2,1/-3,-3,1/-2,-2,1/-2,2,1/-3,3,1/-2,2,1/2,2,1/8,0,0
  154. \272/-7,8,0/-1,8,1/0,0,0
  155. \273/-7,-2,0/-1,-2,1/0,0,0
  156. \274/4,0,1/4,2,0/0,4,1/4,6,1/6,0,0
  157. \275/4,0,1/4,2,0/0,2,1/0,4,0/4,4,1/6,0,0
  158. \276/4,0,1/0,2,0/4,4,1/0,6,1/6,0,0
  159. \277/2,0,0/2,0,1/2,2,0/2,3,1/4,5,1/3,6,1/1,6,1/0,5,1/6,0,0
  160. \300/2,2,0/2,4,1/1,3,1/2,2,1/3,2,1/4,3,1/4,5,1/3,6,1/1,6,1/0,5,1/0,1,1/1,0,1/3,0,1/4,1,1/6,0,0
  161. \301/1,0,0/0,0,1/2,6,1/4,0,1/3,0,1/1,3,0/3,3,1/6,0,0
  162. \302/3,0,1/4,1,1/4,2,1/3,3,1/1,3,1/3,3,1/4,4,1/4,5,1/3,6,1/0,6,1/1,6,1/1,0,1/6,0,0
  163. \303/1,1,1/3,1,1/4,2,1/1,3,0/3,3,1/0,4,0/1,5,1/3,5,1/4,6,1/6,0,0
  164. \304/4,0,1/2,6,1/0,0,1/6,0,0
  165. \305/4,1,0/4,0,1/0,0,1/1,0,1/1,6,1/0,6,1/4,6,1/4,5,1/1,3,0/3,3,1/3,4,1/3,2,1/6,0,0
  166. \306/1,0,0/3,0,1/2,0,1/2,6,1/1,6,1/3,6,1/0,4,0/2,5,1/4,4,1/4,2,1/2,1,1/0,2,1/0,4,1/6,0,0
  167. \307/2,0,1/1,0,1/1,6,1/0,6,1/4,6,1/4,5,1/6,0,0
  168. \310/1,0,1/1,6,1/0,6,1/4,0,0/3,0,1/3,6,1/4,6,1/1,3,0/3,3,1/6,0,0
  169. \311/1,0,0/3,0,1/2,0,1/2,6,1/1,6,1/3,6,1/6,0,0
  170. \312/4,1,0/4,0,1/0,0,1/3,3,1/0,6,1/4,6,1/4,5,1/6,0,0
  171. \313/1,0,1/1,6,1/0,6,1/1,2,0/4,6,1/3,6,1/2,3,0/4,0,1/3,0,1/6,0,0
  172. \314/1,0,1/2,6,1/3,0,1/4,0,1/6,0,0
  173. \315/1,0,0/0,0,1/0,6,1/2,3,1/4,6,1/4,0,1/3,0,1/6,0,0
  174. \316/1,0,0/0,0,1/0,6,1/4,0,1/4,6,1/3,6,1/6,0,0
  175. \317/1,0,0/3,0,1/4,2,1/4,5,1/3,6,1/1,6,1/0,3,1/0,1,1/1,0,1/6,0,0
  176. \320/1,0,1/1,6,1/0,6,1/4,6,1/3,6,1/3,0,1/4,0,1/6,0,0
  177. \321/1,0,0/3,0,1/4,2,1/4,4,1/3,6,1/1,6,1/0,4,1/0,2,1/1,0,1/0,2,0/1,3,1/0,4,1/1,3,1/3,3,1/4,4,1/3,3,1/4,2,1/6,0,0
  178. \322/1,0,1/1,6,1/0,6,1/3,6,1/4,5,1/4,4,1/3,3,1/1,3,1/6,0,0
  179. \323/4,1,0/4,0,1/0,0,1/3,3,1/0,6,1/4,6,1/4,5,1/6,0,0
  180. \324/1,0,0/3,0,1/2,0,1/2,6,1/0,5,0/0,6,1/4,6,1/4,5,1/6,0,0
  181. \325/1,0,0/3,0,1/2,0,1/2,5,1/0,5,0/1,6,1/2,5,1/3,6,1/4,5,1/6,0,0
  182. \326/2,0,0/4,6,1/0,6,1/2,0,1/6,0,0
  183. \327/1,0,1/1,1,1/0,2,1/0,5,1/1,6,1/3,6,1/4,5,1/4,2,1/3,1,1/3,0,1/4,0,1/6,0,0
  184. \330/1,0,0/0,0,1/4,6,1/3,6,1/1,6,0/0,6,1/4,0,1/3,0,1/6,0,0
  185. \331/1,0,0/3,0,1/2,0,1/2,6,1/1,6,1/3,6,1/0,5,0/1,2,1/3,2,1/4,5,1/6,0,0
  186. \332/0,5,0/0,6,1/4,6,1/0,0,1/4,0,1/4,1,1/6,0,0
  187. \333/0,-4,0
  188. \334/0,5,0/4,1,1/6,0,0
  189. \335/0,4,0
  190. \336/1,0,0/0,0,1/2,6,1/4,0,1/3,0,1/1,3,0/3,3,1/2,8,0/3,9,1/2,10,1/1,9,1/2,8,1/6,0,0
  191. \337/-6,0,0
  192. \340/1,6,0/3,4,1/6,0,0
  193. \341/4,4,0/3,1,1/2,0,1/1,0,1/0,1,1/0,3,1/1,4,1/2,4,1/3,3,1/3,1,1/4,0,1/6,0,0
  194. \342/0,-1,0/0,1,1/1,5,1/2,6,1/3,6,1/4,5,1/4,4,1/3,3,1/1,3,1/3,3,1/4,2,1/4,1,1/3,0,1/1,0,1/0,1,1/6,0,0
  195. \343/2,-1,0/3,0,1/2,0,1/0,1,1/0,2,1/1,3,1/3,4,1/1,3,1/0,4,1/1,5,1/1,6,1/1,5,1/3,6,1/6,0,0
  196. \344/4,5,0/3,6,1/1,6,1/2,4,1/2,3,1/3,3,1/4,2,1/3,0,1/1,0,1/0,1,1/1,3,1/2,3,1/6,0,0
  197. \345/4,0,0/2,0,1/0,1,1/0,3,1/2,4,1/4,4,1/0,2,0/3,2,1/6,0,0
  198. \346/1,0,0/3,0,1/4,1,1/4,3,1/3,4,1/1,4,1/0,3,1/0,1,1/1,0,1/1,-2,0/3,6,1/6,0,0
  199. \347/4,6,0/2,3,1/1,1,1/2,0,1/2,3,1/1,6,1/0,6,1/6,0,0
  200. \350/1,0,0/1,3,1/0,4,1/1,3,1/2,4,1/3,4,1/4,3,1/3,-2,1/6,0,0
  201. \351/2,4,0/1,1,1/1,0,1/2,0,1/3,1,1/6,0,0
  202. \352/2,0,1/3,1,1/0,3,1/0,4,1/2,4,1/3,3,1/6,0,0
  203. \353/1,5,1/0,1,0/4,5,1/2,3,0/4,0,1/6,0,0
  204. \354/2,3,1/4,0,1/2,3,0/1,6,1/0,6,1/6,0,0
  205. \355/0,-1,0/0,1,1/1,4,1/0,1,0/1,0,1/2,0,1/3,1,1/4,0,1/3,1,1/4,4,1/6,0,0
  206. \356/0,4,0/1,4,1/1,0,1/2,0,1/4,4,1/6,0,0
  207. \357/1,0,0/3,0,1/4,3,1/3,4,1/1,4,1/0,1,1/1,0,1/6,0,0
  208. \360/1,0,0/1,4,1/0,4,1/4,4,1/3,4,1/3,-1,1/6,0,0
  209. \361/1,0,0/3,0,1/4,2,1/4,3,1/3,4,1/1,4,1/0,2,1/0,1,1/1,0,1/0,2,0/4,2,1/6,0,0
  210. \362/0,-2,0/1,3,1/2,4,1/3,4,1/4,3,1/3,0,1/1,0,1/1,1,1/6,0,0
  211. \363/4,5,0/4,4,1/1,4,1/0,1,1/1,0,1/3,0,1/4,3,1/3,4,1/6,0,0
  212. \364/3,0,0/2,1,1/2,4,1/0,3,0/1,4,1/3,4,1/4,5,1/6,0,0
  213. \365/0,4,0/1,3,1/1,1,1/2,0,1/3,0,1/4,2,1/4,4,1/6,0,0
  214. \366/0,6,0/4,2,1/3,0,1/1,0,1/0,1,1/1,3,1/3,3,1/6,0,0
  215. \367/1,4,0/0,3,1/0,1,1/1,0,1/2,1,1/2,2,1/2,1,1/3,0,1/4,1,1/4,3,1/3,4,1/6,0,0
  216. \370/4,4,1/0,4,0/1,4,1/3,0,1/4,0,1/6,0,0
  217. \371/0,4,0/1,3,1/1,0,1/3,0,1/4,2,1/4,4,1/3,6,0/2,-1,1/6,0,0
  218. \372/1,0,0/2,-1,1/3,-1,1/3,1,1/1,2,1/1,4,1/3,6,1/4,6,1/4,5,1/1,5,1/0,6,1/6,0,0
  219. \373/0,4,0
  220. \374/0,-2,0/0,-3,1/1,-3,1/2,9,1/3,9,1/3,8,1/6,0,0
  221. \375/0,-4,0
  222. \376/0,3,0/1,2,1/2,2,1/4,4,1/5,4,1/6,3,1/5,2,1/4,2,1/2,4,1/1,4,1/0,3,1/8,0,0
  223. SHAR_EOF
  224. cat << \SHAR_EOF > plot3d.c
  225. /*
  226.  
  227.       plot3d - program to plot three dimensional surfaces
  228.   
  229.     The CRC graphics package
  230.  
  231.     Malcolm Slaney
  232.     April 12, 1982
  233.  
  234.     Hacked heavily from qplot code by
  235.         Carl Crawford
  236.         Purdue University
  237.         W. Lafayette, Indiana
  238.         April 3, 1979
  239.   
  240.  
  241.     MODIFICATIONS:
  242.         Changed parameter code so that xcount and ycount default
  243.         to (size-begin+1)/(skip+1)...................Malcolm 8/25/82
  244.  
  245.         Added Ascii Input format.....................Malcolm 11/30/82
  246.  
  247.         Changed device mappings......................Malcolm 10/22/83
  248.  
  249.         Added several more options and arguments when truplt was 
  250.         modified and named newtru. Newtru will now draw the function
  251.         below(phi2>0) or above(phi2<0) the horizon if the x-y axes 
  252.         are not drawn. For more details see newtru.f. 
  253.         The new arguments are :
  254.         xdig, ydig, zdig, dig, xl, yl, zl, xlen, ylen, zlen, len, 
  255.         xtic, ytic, ztic, tic, zmin, direction(=[xy]), 
  256.         resolution(0.7< >4.0).
  257.         The new flags are -l and -z.
  258.         Specifying dir=y would do the job of -k flag, so later on -k
  259.         should be removed. Resolution is added to get a better 
  260.         resolution in line hiding.
  261.                                 Mani 12/7/83
  262.  
  263.         xmin, xmax, ymin, ymax and raxis parameters have been added 
  264.         to the list of parameters. raxis=[xy] would specify whether
  265.         the the values for x and y axes be converted to float or not. 
  266.                                 Mani 3/29/84
  267.  
  268.         z has been added to the list of options for raxis=[xyz]. 
  269.                                 Mani 4/10/84
  270. */
  271.  
  272. #include    <stdio.h>
  273. #include    <math.h>
  274.  
  275. #define    MLAB 80        /* maximum axes label size */
  276. #define LARGE 1.0e31    /* large number used as a flag for not setting a var. */
  277. #define XYSIZE 514    /* array size for x and y */
  278.  
  279. #define    DevNum(Major,Minor)    ((Major) + (Minor)*8)
  280.  
  281. #define    BIT    0    /* major device table */
  282. #define GOV    1
  283. #define IMAGE    2
  284. #define    GGOV    3
  285. #define    GIMAGE    4
  286. #define    PLOT    5
  287. #define    TEK    6
  288. #define HP    7
  289.  
  290. #define    STDOUT        0    /* Special Device Numbers */
  291. #define    VERSATEC    8
  292. #define    PRINTRONIX    16
  293. #define    RETRO        14
  294. #define    TEK4113        22
  295.  
  296. int    logx;        /* !=0 => x axis logrithmic */
  297.  
  298. int    logx;        /* !=0 => x axis logrithmic */
  299. int    logy;        /* !=0 => y axis logrithmic */
  300. long    prnt    = 0;    /* FOR DEBUGGING    */
  301. long    pxaxis    = 1;    /* 1=plot the x axis
  302.                0=don't plot the x axis*/
  303. long    pyaxis    = 1;    /* 1=plot the y axis
  304.                0=don't plot the y axis*/
  305. long    pzaxis    = 1;    /* 1=plot the z-axis,
  306.                0=don't plot the z-axis */
  307. int     use[2] = {0,0}; /* 1=use x or y file */
  308. int    reverse = 0;    /* Reverse Z direction in plot */
  309. float   scfac  = 1.0;   /* scale factor in plot */
  310. char    *xyf[2] = {"x","y"};    
  311.             /* default x and y input file */
  312. char    *zf =    "z";    /* Default z input file */
  313. char    *xyzf ="xyzbnd";/* default boundary file */
  314. int    opsc = 0;    /* 1= "xyzbnd" has been opened */
  315. int    dash;        /* 1= plot with dashed line */
  316. float    xxs,yys;    /* starting locations for the graph */
  317. int    spd = 36;    /* speed of hp plotter */
  318. int    savesc;        /* 1=save the generated scale file */
  319. char    *xlp = NULL;    /* x axis label */
  320. char    *ylp = NULL;    /* y axis label */
  321. char    *zlp = NULL;    /* z axis label */
  322. long    prmpt=0;    /* 1=prompt for labels from standard input */
  323. char    xlab[MLAB];    /* buffer to hold x labels */
  324. char    ylab[MLAB];    /* buffer to hold y labels */
  325. char    zlab[MLAB];    /* buffer to hold z labels */
  326. char    *el;            /* end label */
  327. char    *tl = NULL;    /* top label */
  328. char    *bl = NULL;    /* bottom label */
  329. char    *host;        /* host overide for all pipes */
  330. char    *plotstr;    /* plot device overide for all pipes */
  331. char    *devstr;    /* device overide name */
  332. float    height = 0.2;    /* character heights */
  333. float    maxmin[6];    /* command string max,min values */
  334. int    umxmn[6]= {0,0,0,0,0,0};    
  335.             /* 1=corresponding maxmin value entered */
  336. int     real[3] = {0,0,0};/* 1=x, y or z axes becomes float */
  337. int    byte[3] = {3,3,5};
  338.             /* default type for x, y and z vectors */
  339. int    begin[2] ={0,0};/* Starting X and Y coord of interest */
  340. int    skip[2] ={0,0};    /* Number of points in x and y to skip */
  341. int    xysize[2] ={64,64};    
  342.             /* Number of points in matrix for x and y indices */
  343. int     count[3] ={0,0,0};
  344.             /* number of vector points in x and y direction to use*/
  345. int     pen   = 1;      /* hp pen color */
  346. char    *stfl = "-";    /* default file for -p option */
  347. float   len[3] = {8.0,8.0,8.0};    
  348.             /* length of x, y and z axes */
  349. int     frame;          /* 1=frame plot with border */
  350. int     dig[3] ={6,6,6};/* number of sig. digits for x, y and z axes */
  351. int    online;        /* 1=use online symbols */
  352. int     sym  =   4;     /* default online symbol */
  353. int     jol  =  1;      /* default j for sline */
  354. float   tic[3] = {1.0,1.0,1.0};    
  355.             /* default x, y and z tic distances */
  356. float   ds =    .1;     /* default dash length */
  357. float   gp =    .1;     /* default gap length */
  358. char    *siten = "pl";  /* default site for gplp */
  359. int    blank;        /* blank flag */
  360. int     devn;           /* minor device number */
  361. int     dev = PRINTRONIX;/* major device number */
  362. long    ydir = 1;    /* Print y lines (crosshatch) */
  363. long    xdir = 0;    /* Print x lines (crosshatch) */
  364. float    phi1 = 40.0;    /* Orientation of x-y plane */;
  365. float    phi2 = 30.0;    /* Tilt of plane */
  366. float    base = LARGE;    /* Z Location of xy plane in plot, default is zmax */
  367. float    resol = 1.0;    /* Resol*1700 horiz. steps is used for line hiding */ 
  368. char    *dirn = "y";    /* Default direction for line drawings */
  369. char    *axisn = "xyz";    /* Default for axes drawings */
  370. char    *raxis = NULL;    /* Default direction for line drawings */
  371.  
  372. int     size[] = {
  373.         sizeof(char),   /* signed char */
  374.         sizeof(char),   /* unsigned char */
  375.         sizeof(short),  /* short integer */
  376.         sizeof(int),    /* integer */
  377.         sizeof(long),   /* long integer */
  378.         sizeof(float),  /* float */
  379.         sizeof(double), /* double */
  380.     };
  381.  
  382. #define INT     0
  383. #define FLOAT   1
  384. #define LONG    2
  385. #define CHAR    3
  386.  
  387. struct hash  {
  388.     char    *label;
  389.     int     type;
  390.     char    **pointer;
  391.     } table[] = {
  392. /* 1 */         {"x",CHAR,&xyf[0]},
  393. /* 2 */         {"y",CHAR,&xyf[1]},
  394. /* 3 */         {"z",CHAR,&zf},
  395. /* 4 */         {"s",CHAR,&xyzf},
  396. /* 5 */         {"g",CHAR,&stfl},
  397. /* 6 */         {"xp",FLOAT,(char **)&xxs},
  398. /* 7 */         {"yp",FLOAT,(char **)&yys},
  399. /* 8 */         {"xl",CHAR,&xlp},
  400. /* 9 */         {"yl",CHAR,&ylp},
  401. /* 10 */        {"zl",CHAR,&zlp},
  402. /* 11 */        {"begin",LONG,(char **)&begin[0]},
  403. /* 12 */        {"xmin",FLOAT,(char **)&maxmin[0]},
  404. /* 13 */        {"xmax",FLOAT,(char **)&maxmin[1]},
  405. /* 14 */        {"ymin",FLOAT,(char **)&maxmin[2]},
  406. /* 15 */        {"ymax",FLOAT,(char **)&maxmin[3]},
  407. /* 16 */        {"zmin",FLOAT,(char **)&maxmin[4]},
  408. /* 17 */        {"zmax",FLOAT,(char **)&maxmin[5]},
  409. /* 18 */        {"xcount",INT,(char **)&count[0]},
  410. /* 19 */        {"ycount",INT,(char **)&count[1]},
  411. /* 20 */        {"pen",INT,(char **)&pen},
  412. /* 21 */        {"scfac",FLOAT,(char **)&scfac},
  413. /* 22 */        {"xlen",FLOAT,(char **)&len[0]},
  414. /* 23 */        {"ylen",FLOAT,(char **)&len[1]},
  415. /* 24 */        {"zlen",FLOAT,(char **)&len[2]},
  416. /* 25 */        {"site",CHAR,&siten},
  417. /* 26 */    {"speed",INT,(char **)&spd},
  418. /* 27 */    {"tl",CHAR,&tl},
  419. /* 28 */    {"bl",CHAR,&bl},
  420. /* 29 */    {"op",CHAR,&host},
  421. /* 30 */    {"phi1",FLOAT,(char **)&phi1},
  422. /* 31 */    {"phi2",FLOAT,(char **)&phi2},
  423. /* 32 */    {"base",FLOAT,(char **)&base},
  424. /* 33 */    {"len",FLOAT,(char **)&len[0]},
  425. /* 34 */    {"n",INT,(char **)&xysize[0]},
  426. /* 35 */    {"count",INT,(char **)&count[0]},
  427. /* 36 */    {"xbegin",LONG,(char **)&begin[0]},
  428. /* 37 */    {"ybegin",LONG,(char **)&begin[1]},
  429. /* 38 */    {"skip",LONG,(char **)&skip[0]},
  430. /* 39 */    {"xskip",LONG,(char **)&skip[0]},
  431. /* 40 */    {"yskip",LONG,(char **)&skip[1]},
  432. /* 41 */    {"size",LONG,(char **)&xysize[0]},
  433. /* 42 */    {"xsize",LONG,(char **)&xysize[0]},
  434. /* 43 */    {"ysize",LONG,(char **)&xysize[1]},
  435. /* 44 */        {"dig",INT,(char **)&dig[0]},
  436. /* 45 */        {"xdig",INT,(char **)&dig[0]},
  437. /* 46 */        {"ydig",INT,(char **)&dig[1]},
  438. /* 47 */        {"zdig",INT,(char **)&dig[2]},
  439. /* 48 */        {"tic",FLOAT,(char **)&tic[0]},
  440. /* 49 */        {"xtic",FLOAT,(char **)&tic[0]},
  441. /* 50 */        {"ytic",FLOAT,(char **)&tic[1]},
  442. /* 51 */        {"ztic",FLOAT,(char **)&tic[2]},
  443. /* 52 */        {"res",FLOAT,(char **)&resol},
  444. /* 53 */        {"resolution",FLOAT,(char **)&resol},
  445. /* 54 */        {"dir",CHAR,&dirn},
  446. /* 55 */        {"direct",CHAR,&dirn},
  447. /* 56 */        {"direction",CHAR,&dirn},
  448. /* 57 */    {"dev",CHAR,&devstr},
  449. /* 58 */    {"plot",CHAR,&plotstr},
  450. /* 59 */    {"zaxis",FLOAT,(char **)&base},    /*should be removed later on*/
  451. /* 60 */    {"raxis",CHAR,&raxis},    
  452. /* 61 */        {"axis",CHAR,&axisn},
  453.         {0,0,0}
  454.     };
  455.  
  456. struct    devtable {
  457.     int    dev;
  458.     char    *devstr;
  459.         } devtab[] = {
  460.         {TEK4113,"4113"},
  461.         {0,0}
  462.         };
  463.  
  464.  
  465. main(argc,argv)
  466.     int    argc;
  467.     char    **argv;
  468. {
  469.     FILE    *fd;
  470.     float   xyd[2*XYSIZE],dum1,dum2;
  471.     float    *zd;
  472.     long    atol();
  473.     float    max(),min();
  474.     register int    i,j,k;
  475.     int    idum,iflag,ky,incr;
  476.     float    fdum,dxy,zmin,zmax,tmp;
  477.     char    buf[10];
  478.     char    *getenv();
  479.  
  480.     long    n, n1, nxx, nyy, nxdim;
  481.  
  482.     if((fd = fopen("/etc/cpu","r")) != NULL){
  483.         fgets(buf,10,fd);
  484.         buf[strlen(buf) -1] = 0;
  485.         if(strcmp(buf,"arpa") == 0)
  486.             dev = DevNum(GOV,0);
  487.         fclose(fd);
  488.     }
  489.     file();
  490.     args();
  491.     parse(argc,argv);
  492.  
  493.     if( strcmp(axisn,"xyz") != 0){
  494.         pxaxis = 0;
  495.         pyaxis = 0;
  496.         pzaxis = 0;
  497.         for( i=0 ; *(axisn+i) != NULL ; i++ ){
  498.             if( *(axisn+i) == 'x' ){
  499.                 pxaxis = 1;
  500.             }else if( *(axisn+i) == 'y' ){
  501.                 pyaxis = 1;
  502.             }else if( *(axisn+i) == 'z' ){
  503.                 pzaxis = 1;
  504.             }else{
  505.                 fprintf(stderr,"bad argument in axis=%s\n"
  506.                     ,axisn);
  507.                 exit(1);
  508.             }
  509.         }
  510.     }
  511.         
  512.     if(strcmp(dirn,"x") == 0){
  513.         xdir = 1;
  514.         ydir = 0;
  515.     }else if(strcmp(dirn,"y") == 0){
  516.         xdir = 0;
  517.         ydir = 1;
  518.     }else if( (strcmp(dirn,"xy") == 0) || (strcmp(dirn,"yx") == 0) ){
  519.         xdir = 1;
  520.         ydir = 1;
  521.     }else{
  522.         fprintf(stderr,"bad argument in dir=");
  523.         exit(1);
  524.     }
  525.  
  526.     if( raxis != NULL ) {
  527.         for( i=0 ; *(raxis+i) != NULL ; i++ ){
  528.             if( *(raxis+i) == 'x' ){
  529.                 real[0] = 1;
  530.             }else if( *(raxis+i) == 'y' ){
  531.                 real[1] = 1;
  532.             }else if( *(raxis+i) == 'z' ){
  533.                 real[2] = 1;
  534.             }else{
  535.                 fprintf(stderr,"bad argument in raxis=");
  536.                 exit(1);
  537.             }
  538.         }
  539.     }
  540.  
  541.     if( resol > 4.0 )
  542.         resol = 4.0;
  543.     else if ( resol < 0.7 )
  544.         resol = 0.7;
  545.  
  546.     if(count[0] > 512 || count[1] > 512){
  547.         fprintf(stderr,"count[0] and count[1] must be less than 512.\n");
  548.         exit(1);
  549.     }
  550.                     /*
  551.                      *  Set the defaults.......
  552.                      *  user must set size parameters
  553.                      *  the count variables are set based
  554.                      *  on the values of size, begin and
  555.                      *  skip......Malcolm...8/25/82
  556.                      */
  557.     for(k=0;k<2;k++){
  558.         if (count[k] == 0)
  559.             count[k] = (xysize[k]-begin[k])/(double)(skip[k]+1)+.999999;
  560.     }
  561.  
  562.     zd = (float *)calloc(count[0]*count[1],sizeof(float));
  563.     if (!zd){
  564.         fprintf(stderr,"Can't allocate space for data.\n");
  565.         exit(3);
  566.     }
  567.  
  568.                     /* show they are not set */
  569.     if (!umxmn[4])                
  570.         maxmin[4] = -LARGE;
  571.     if (!umxmn[5])            
  572.         maxmin[5] = LARGE;                
  573.  
  574.     count[2] = matrixinput(zf,byte[2],zd);
  575.     if( real[2] ){
  576.         byte[2] = 5;
  577.     }else if( byte[2] != 3 ){
  578.         byte[2] = 5;
  579.     }
  580.     if (count[2] != count[0]*count[1]){
  581.         fprintf(stderr,"Only read %d of %d points in z file.\n",
  582.             count[2], count[0]*count[1]);
  583.         exit(2);
  584.     }
  585.  
  586.     zmin   = *zd;
  587.     zmax   = zmin;
  588.     for(i=0;i<count[2];i++){ 
  589.         fdum    = *(zd+i);
  590.         if( fdum < zmin ){
  591.             zmin = fdum;
  592.         }else if ( fdum > zmax){ 
  593.             zmax = fdum;
  594.         }
  595.         if( umxmn[4] && (fdum < maxmin[4]) ) *(zd+i) = maxmin[4];
  596.         if( umxmn[5] && (fdum > maxmin[5]) ) *(zd+i) = maxmin[5];
  597.     }
  598.     if( !umxmn[4] && !umxmn[5] && (zmax == zmin) ){
  599.         fprintf(stderr,"z is constant and no zmin or zmax are set");
  600.         exit(1);
  601.     }
  602.     if( !umxmn[4] ) maxmin[4] = zmin;
  603.     if( !umxmn[5] ) maxmin[5] = zmax;
  604.  
  605.     for(k=0;k<2;k++){
  606.         ky = k * XYSIZE;
  607.         if( use[k] ){
  608.             idum = input(xyf[k],byte[k],xyd+ky,
  609.                     count[k],begin[k],skip[k]);
  610.             if(idum != count[k]){
  611.               fprintf(stderr,"Only read %d of %d points in %s file.\n",idum,count[k],xyf[k]);
  612.               exit(1);
  613.             }
  614.         }
  615.         if( real[k] ){
  616.             byte[k] = 5;
  617.         }else if( byte[k] != 5 && byte[k] != 6 ){
  618.             byte[k] = 3;
  619.         }
  620. /*            
  621.         if( xyd[ky] > xyd[ky+count[k]] ){
  622.             for( i=0 ; i<(count[k]+1)/2 ; i++ ){
  623.                 if( k == 0 ){
  624.                     incr    = 1;
  625.                 }else{
  626.                     incr    = count[0];
  627.                 }
  628.                 for( j=0 ; j<count[(k+1)%2] ; j+=incr ){
  629.                     idum        = (count[k]-i-1)*incr;
  630.                     tmp            = *(zd+i*incr+j);
  631.                     *(zd+i*incr+j)    = *(zd+idum+j);
  632.                     *(zd+idum+j)    = tmp;
  633.                 }
  634.                 tmp            = xyd[i];
  635.                 xyd[i]            = xyd[count[k]-i-1];
  636.                 xyd[count[k]-i-1]    = tmp;
  637.             }
  638.         }
  639.                                     */
  640.     }
  641.     if( (fd = fopen(xyzf,"r")) == NULL){
  642.         if( use[0] ) scale(xyd,count[0]);
  643.         if( use[1] ) scale(xyd+XYSIZE,count[1]);
  644.     }else{
  645.         fscanf(fd,"%f %f %f %f %f %f",xyd+count[0],xyd+count[0]+1,xyd+XYSIZE+count[1],xyd+XYSIZE+count[1]+1,&dum1,&dum2);
  646.         fclose(fd);
  647.         opsc = 1;
  648.         if( !umxmn[4] ){
  649.             maxmin[4] = dum1;
  650.             umxmn[4] = 1;
  651.         }
  652.         if( !umxmn[5] ){
  653.             maxmin[5] = dum2;
  654.             umxmn[5] = 1;
  655.         }
  656.     }
  657.  
  658.     for(k=0;k<2;k++){
  659.         ky = k * XYSIZE;
  660.         for(i=0;i<2;i++){
  661.             if( umxmn[k*2+i] )
  662.                 xyd[ky+count[k]+i] = maxmin[k*2+i];
  663.             else if( opsc ){
  664.                 umxmn[k*2+i] = 1;
  665.                 maxmin[k*2+i] = xyd[ky+count[k]+i];
  666.             }
  667.         }
  668.     }
  669.             
  670.     for(k=0;k<2;k++){
  671.         ky = k * XYSIZE;
  672.         if( !use[k] ){
  673.             if( umxmn[k*2] && umxmn[k*2+1] ){
  674.                 dxy = (maxmin[k*2+1]-maxmin[k*2])/(count[k]-1);
  675.                 xyd[ky] = maxmin[k*2];
  676.                 for(i=1;i<count[k];i++) 
  677.                     xyd[ky+i] = xyd[ky+i-1] + dxy;
  678.                 xyd[ky+count[k]] = maxmin[k*2];
  679.                 xyd[ky+count[k]+1] = xyd[ky+count[k]-1];
  680.             }else if( umxmn[k*2] ){
  681.                 for(i=0,j=maxmin[k*2];i<count[k];i++,j+=skip[k]+1)
  682.                     xyd[ky+i] = j;
  683.                 xyd[ky+count[k]] = maxmin[k*2];
  684.                 xyd[ky+count[k]+1] = xyd[ky+count[k]-1];
  685.             }else{
  686.                 for(i=0,j=begin[k];i<count[k];i++,j+=skip[k]+1)
  687.                     xyd[ky+i] = j;
  688.                 xyd[ky+count[k]] = begin[k];
  689.                 xyd[ky+count[k]+1] = xyd[ky+count[k]-1];
  690.             }
  691.         }
  692.     }
  693. /*
  694.     for(k=0;k<2;k++){
  695.         ky = k * XYSIZE;
  696.         if(byte[k] <= 4 && !(umxmn[k*2] && umxmn[k*2+1])){
  697.             i = floor(len[k] / tic[k]);
  698.             xyd[ky+count[k]+1] = ceil( (xyd[ky+count[k]+1]
  699.                 - xyd[ky+count[k]])/i ) * i + xyd[ky+count[k]];
  700.         }
  701.     }
  702.                                 */
  703.     if(savesc){
  704.         if((fd=fopen(xyzf,"w")) == NULL)err("can't create: ",xyzf);
  705.         fprintf(fd,"%e %e %e %e %e %e \n",xyd[count[0]],
  706.         xyd[count[0]+1],xyd[XYSIZE+count[0]],xyd[XYSIZE+count[0]+1],
  707.         maxmin[4],maxmin[5]);
  708.         fclose(fd);
  709.     }
  710.  
  711.     iflag = 0;
  712.     for(k=0;k<2;k++){
  713.         ky = k * XYSIZE;
  714.         idum = ky + count[k];
  715.         if( xyd[ky] < xyd[idum-1] ){
  716.           if( ( umxmn[k*2] && ( xyd[ky] < xyd[idum] ) ) || 
  717.             ( umxmn[k*2+1] && ( xyd[idum-1] > xyd[idum+1] ) ) ){
  718.             fprintf(stderr,"1: plot extends beyond the axes\n");
  719.             iflag = 1;
  720.           }
  721.         }else if( xyd[ky] > xyd[idum-1] ){
  722.           if( (umxmn[k*2+1] && ( xyd[ky] > xyd[idum+1] ) ) ||                    ( umxmn[k*2] && ( xyd[idum-1] < xyd[idum] ) ) ){
  723.             fprintf(stderr,"2: plot extends beyond the axes\n");
  724.             iflag = 1;
  725.               }
  726.         }
  727.     }
  728.     if( iflag ) exit(1);
  729.  
  730. #ifdef sel
  731.     if (xlp != NULL) strcpy(&xlab,xlp);
  732.     if (ylp != NULL) strcpy(&ylab,ylp);
  733.     if (zlp != NULL) strcpy(&zlab,zlp);
  734.     xlp = xlab;
  735.     ylp = ylab;
  736.     zlp = zlab;
  737.  
  738.     if( (pxaxis) && *xlp == NULL && (prmpt) ){
  739.         getlab('x',xlab);
  740.         xlp = xlab;
  741.     }
  742.     if( (pyaxis) && *ylp == NULL && (prmpt) ){
  743.         getlab('y',ylab);
  744.         ylp = ylab;
  745.     }
  746.     if( (pzaxis) && *zlp == NULL && (prmpt)){
  747.         getlab('z',zlab);
  748.         zlp = zlab;
  749.     }
  750. #else
  751.     if( (pxaxis) && xlp == NULL && (prmpt) ){
  752.         getlab('x',xlab);
  753.         xlp = xlab;
  754.     }
  755.     if( (pyaxis) && ylp == NULL && (prmpt) ){
  756.         getlab('y',ylab);
  757.         ylp = ylab;
  758.     }
  759.     if( (pzaxis) && zlp == NULL && (prmpt)){
  760.         getlab('z',zlab);
  761.         zlp = zlab;
  762.     }
  763.     /* Added to keep from dereferencing a NULL pointer later. --kcd */
  764.     if(tl == NULL){
  765.         tl = "";
  766.     }
  767.     if(bl == NULL){
  768.         bl = "";
  769.     }
  770.     if(xlp == NULL){
  771.         xlab[0] = '\0';
  772.         xlp = xlab;
  773.     }
  774.     if(ylp == NULL){
  775.         ylab[0] = '\0';
  776.         ylp = ylab;
  777.     }
  778.     if(zlp == NULL){
  779.         zlab[0] = '\0';
  780.         zlp = zlab;
  781.     }
  782. #endif
  783.  
  784.     if(dev == DevNum(GOV,0) || dev == DevNum(IMAGE,0) ||
  785.         dev == DevNum(GGOV,0) || dev == DevNum(GIMAGE,0)){
  786.         if(devn){
  787.             devn -= '0';
  788.             if(dev == DevNum(IMAGE,0) || dev == DevNum(GIMAGE,0))
  789.                 devn += 1;
  790.         }
  791.         dev |= devn << 3;
  792.     }
  793.     strcpy(buf,"-");
  794.     strcat(buf,siten);
  795.     site(buf);
  796.     fname(stfl);
  797.     if(host || dev == PLOT)
  798.         dev |= 0100;
  799.     if (host)
  800.         plots(dev,blank,host);
  801.     else if (dev == 0100 | PLOT)
  802.         plots(dev,blank,plotstr);
  803.     else
  804.         plots(dev,blank,NULL);
  805.     newpen(pen);
  806.     speed(spd);
  807. /*    plot(xxs*1.25,yys*1.25,-3);        */
  808.     plot(xxs,yys,-3);
  809.     plot(0,0,-3);
  810.  
  811.     if(frame ){
  812.         plot(0.00,0.00,3);
  813.         plot(0.00,10.0,2);
  814.         plot(10.0,10.0,2);
  815.         plot(10.0,0.00,2);
  816.         plot(0.05,0.00,2);
  817.     }
  818.   
  819. /*
  820.     plot3d sets up the view angles, and other constants for
  821.     newtru, which does the real ploting
  822.  
  823.     called with a vector x and y for position and the
  824.     data in the array z.
  825.  
  826.     Also need xcount, ycount, and zcount
  827.  
  828. */
  829.     n1=n-1;
  830.  
  831.                 /* setup constants for 3d plot routine */
  832.     nxx=count[0];
  833.     nyy=count[1];
  834.     nxdim=count[0];
  835.  
  836.                 /* call plotting routine */
  837.     newtru_(zd,xyd,xyd+XYSIZE,&nxx,&nyy,&nxdim,&phi1,&phi2
  838.     ,len,len+1,len+2,byte,byte+1,byte+2,dig,dig+1,dig+2,tic,tic+1,tic+2
  839.     ,xlp,ylp,zlp,tl,bl,&scfac,&xdir,&ydir,&maxmin[5],&maxmin[4],&umxmn[4]
  840.     ,&base,&pxaxis,&pyaxis,&pzaxis,&resol,&prnt);
  841.     plot(0.0,0.0,999);
  842.     exit(0);
  843. }
  844.  
  845.  
  846. float    max(x,y)
  847.     float    x,y;
  848. {
  849.     return( (x > y)? x : y);
  850. }
  851.  
  852. float    min(x,y)
  853.     float    x,y;
  854. {
  855.     return( (x < y)? x : y);
  856. }
  857.  
  858. matrixinput(name,n,vec)
  859.     char    *name;            /* Name of file */
  860.     int    n;            /* Size of data in file */
  861.     float    *vec;            /* Place to put result */
  862. {
  863.     register int    i,ns, x, y,j;
  864.     float    zmax,zmin;
  865.     FILE    *fd;
  866.     char    buf[sizeof(double)];
  867.  
  868.     zmax    = HUGE;
  869.     zmin    = -HUGE;
  870.     if( (fd = fopen(name,"r")) == NULL){
  871.         fprintf(stderr,"can't open: %s\n",name);
  872.         exit(1);
  873.     }
  874.     if (n == 7){
  875.         long    SeekTo, numcount;
  876.         float    xtmp;
  877.  
  878.         numcount = i = 0;
  879.         for (y=0;y<count[1] && !feof(fd);y++){
  880.             SeekTo = ((long)y*(skip[1]+1)+begin[1])*xysize[0]
  881.                                 + begin[0];
  882.             while (numcount < SeekTo){
  883.                 fscanf(fd,"%f",&xtmp);
  884.                 numcount++;
  885.             }
  886.             for (x=0;x<count[0] && !feof(fd);x++){
  887.                 fscanf(fd,"%f",&xtmp);
  888.                 *vec = xtmp;
  889.                 if (reverse)
  890.                     *vec *= -1.0;
  891.                 if (*vec > zmax)
  892.                     *vec = zmax;
  893.                 if (*vec < zmin)
  894.                     *vec = zmin;
  895.                 vec++;
  896.                 i++;
  897.                 numcount++;
  898.                 if( x < count[0]-1 )
  899.                     for (j=0;j<skip[0]&&fscanf(fd,"%f"
  900.                             ,&xtmp)>0;j++)
  901.                         numcount++;
  902.             }
  903.         }
  904.     }
  905.     else {
  906.         ns = size[n];
  907.         i = 0;
  908.  
  909.         for (y=0;y<count[1];y++){
  910.             fseek(fd,(((long)y*(skip[1]+1)+begin[1])*xysize[0]
  911.                             + begin[0])*ns,0);
  912.             for (x=0;x<count[0];x++){
  913.                 fread(buf,ns,1,fd);
  914.                 if (feof(fd))
  915.                     break;
  916.                 i++;
  917.                 switch(n){
  918.  
  919.                 case 0: /* signed char */
  920.                     *vec = *((char *)buf);
  921.                     break;
  922.                 case 1: /* unsigned char */
  923.                     *vec = *((char *)buf) & 0377;
  924.                     break;
  925.                 case 2: /* short */
  926.                     *vec = *((short *)buf);
  927.                     break;
  928.                 case 3: /* int */
  929.                     *vec = *((int *)buf);
  930.                     break;
  931.                 case 4: /* long */
  932.                     *vec = *((long *)buf);
  933.                     break;
  934.                 case 5: /* float */
  935.                     *vec = *((float *)buf);
  936.                     break;
  937.                 case 6: /* double */
  938.                     *vec = *((double *)buf);
  939.                     break;
  940.                 }
  941.                 if (reverse)
  942.                     *vec *= -1.0;
  943.                 if (*vec > zmax)
  944.                     *vec = zmax;
  945.                 if (*vec < zmin)
  946.                     *vec = zmin;
  947.                 vec++;
  948.                 fseek(fd,(long)(skip[0]*ns),1);
  949.             }
  950.         }
  951.     }
  952.     if(!i){
  953.         fprintf(stderr,"no points read from input file\n");
  954.         exit(1);
  955.     }
  956.     fclose(fd);
  957.     if (zmax == zmin) {
  958.         printf("plot3d: Entire matrix equals %g.\n",zmax);
  959.         exit(2);
  960.     }
  961.     return(i);
  962. }
  963.  
  964.  
  965. input(name,n,vec, count, begin, skip)
  966.     char    *name;
  967.     int    n;
  968.     int    count, begin, skip;
  969.     float    *vec;
  970. {
  971.     register int    i,ns;
  972.     FILE    *fd;
  973.     char    buf[sizeof(double)];
  974.  
  975.     if( (fd = fopen(name,"r")) == NULL){
  976.         fprintf(stderr,"can't open: %s\n",name);
  977.         exit(1);
  978.     }
  979.     if (n == 7){
  980.         int    j;
  981.         float    x;
  982.  
  983.         i = begin;
  984.         while ( i-- > 0 && fscanf(fd,"%f",&x) > 0);
  985.         i = 0;
  986.         while (i < count && fscanf(fd,"%f",&x) > 0){
  987.             *vec++ = x;
  988.             i++;
  989.             for (j=0;j<skip && fscanf(fd,"%f",&x) > 0;j++);
  990.         }
  991.     }
  992.     else {
  993.         ns = size[n];
  994.         i = 0;
  995.         fseek(fd,(long)(begin * ns),0);
  996.         while(i<count && fread(buf,ns,1,fd)){
  997.             switch(n){
  998.  
  999.             case 0: /* signed char */
  1000.                 *vec++ = *((char *)buf);
  1001.                 break;
  1002.             case 1: /* unsigned char */
  1003.                 *vec++ = *((char *)buf) & 0377;
  1004.                 break;
  1005.             case 2: /* short */
  1006.                 *vec++ = *((short *)buf);
  1007.                 break;
  1008.             case 3: /* int */
  1009.                 *vec++ = *((int *)buf);
  1010.                 break;
  1011.             case 4: /* long */
  1012.                 *vec++ = *((long *)buf);
  1013.                 break;
  1014.             case 5: /* float */
  1015.                 *vec++ = *((float *)buf);
  1016.                 break;
  1017.             case 6: /* double */
  1018.                 *vec++ = *((double *)buf);
  1019.                 break;
  1020.             }
  1021.             i++;
  1022.             fseek(fd,(long)(skip*ns),1);
  1023.         }
  1024.     }
  1025.     fclose(fd);
  1026.     if(i == 0){
  1027.         fprintf(stderr,"no points read from input file\n");
  1028.         exit(1);
  1029.     }
  1030.     return(i);
  1031. }
  1032.  
  1033. nbyte(s,n)
  1034.     char    *s;
  1035.     int    *n;
  1036. {
  1037.     while(*s)if(*s == ',' && *(s+1)){
  1038.         *s++ = 0;
  1039.         switch(*s){
  1040.  
  1041.         case 'b':       /* char data */
  1042.         case 'c':
  1043.         case '1':
  1044.             if(*++s == 's')*n = 0;
  1045.             else *n = 1;
  1046.             return;
  1047.         case 's':       /* short */
  1048.         case '2':
  1049.             *n = 2;
  1050.             return;
  1051.         case 'i':       /* integer */
  1052.             *n = 3;
  1053.             return;
  1054.         case 'l':       /* long */
  1055.             *n = 4;
  1056.             return;
  1057.         case 'f':       /* float */
  1058.         case '4':
  1059.             *n = 5;
  1060.             return;
  1061.         case 'd':       /* double */
  1062.         case '8':
  1063.             *n = 6;
  1064.             return;
  1065.         case 'a':    /* ASCII */
  1066.             *n = 7;
  1067.             return;
  1068.         default:
  1069.             err("byte declaration error","");
  1070.         }
  1071.     }else{
  1072.         s++;
  1073.     }
  1074. }
  1075.  
  1076. err(s1,s2)
  1077.     char    *s1,*s2;
  1078. {
  1079.     fprintf(stderr,"%s%s\n",s1,s2);
  1080.     exit(1);
  1081. }
  1082.  
  1083. comm(s)
  1084.     char    *s;
  1085. {
  1086.     register    int    j,r;
  1087.     char    *p;
  1088.     struct hash *hp;
  1089.  
  1090.  
  1091.     for(hp=table;hp->label;hp++){
  1092.         for(j=0;(r=hp->label[j]) == s[j] && r;j++);
  1093.         if(r == 0 && s[j] == '=')
  1094.             if(!s[j+1] && hp->type != CHAR){
  1095.                 s[j] = 0;
  1096.                 err("empty string: ",s);
  1097.             }else{
  1098.                 switch(hp->type){
  1099.  
  1100.                 case CHAR:
  1101.                     *hp->pointer = s + j + 1;
  1102.                     break;
  1103.                 case INT:
  1104.                     *((int *)hp->pointer) = atoi(s+j+1);
  1105.                     break;
  1106.                 case FLOAT:
  1107.                     *((float *)hp->pointer) = atof(s+j+1);
  1108.                     break;
  1109.                 case LONG:
  1110.                     *((long *)hp->pointer) = atol(s+j+1);
  1111.                     break;
  1112.                 }
  1113.                 return(hp - table + 1);
  1114.             }
  1115.     }
  1116.     p = s;
  1117.     while(*p){
  1118.         if(*p == '='){
  1119.             *p = 0;
  1120.             break;
  1121.         }
  1122.         p++;
  1123.     }
  1124.     err("bad option: ",s);
  1125. }
  1126.  
  1127.  
  1128. parse(argc,argv)
  1129.     int    argc;
  1130.     char    **argv;
  1131. {
  1132.     char    c;
  1133.     int     i;
  1134.  
  1135.     while(argv++ , --argc){
  1136.         if(argv[0][0] == '-')while(c = *++*argv)switch(c){
  1137.  
  1138.             case '0':    /* device # */
  1139.             case '1':
  1140.             case '2':
  1141.             case '3':    /* Grinnell #'s */
  1142.             case '4':
  1143.                 devn = c;
  1144.                 break;
  1145.             case 'G':    /* Grinnell */
  1146.                 if (dev == IMAGE || dev == GIMAGE)
  1147.                     dev = GIMAGE;
  1148.                 else
  1149.                     dev = GGOV;
  1150.                 break;
  1151.             case 'd':    /* FOR DEBUGING */
  1152.                 prnt = 1;
  1153.                 break;
  1154.             case 'D':    /* FOR DEBUGING */
  1155.                 prnt = 0;
  1156.                 break;
  1157.             /* -z and -Z SHOULD BE REMOVED LATER */
  1158.             case 'z':    /* don't plot only the z-axis */
  1159.                 pzaxis = 0;
  1160.                 pxaxis = 1;
  1161.                 pyaxis = 1;
  1162.                 break;
  1163.             case 'Z':    /* plot only the z-axis */
  1164.                 pzaxis = 1;
  1165.                 pxaxis = 0;
  1166.                 pyaxis = 0;
  1167.                 break;
  1168.             case 'a':    /* don't plot any of the axes */
  1169.                 pxaxis = 0;
  1170.                 pyaxis = 0;
  1171.                 pzaxis = 0;
  1172.                 break;
  1173.             case 'A':    /* plot all of the axes */
  1174.                 pxaxis = 1;
  1175.                 pyaxis = 1;
  1176.                 pzaxis = 1;
  1177.                 break;
  1178.             case 'g':    /* use graphics overlay */
  1179.                 if (dev == GGOV || dev == GIMAGE)
  1180.                     dev = GGOV;
  1181.                 else
  1182.                     dev = GOV;
  1183.                 break;
  1184.             case 'i':    /* use image plane */
  1185.                 if (dev == GGOV || dev == GIMAGE)
  1186.                     dev = GIMAGE;
  1187.                 else
  1188.                     dev = IMAGE;
  1189.                 break;
  1190.             case 'c':    /* use comtal */
  1191.                 if (dev == IMAGE || dev == GIMAGE)
  1192.                     dev = IMAGE;
  1193.                 else
  1194.                     dev = GOV;
  1195.                 break;
  1196.             case 's':    /* store xy bnd file */
  1197.                 savesc = 1;
  1198.                 break;
  1199.             case 'S':    /* don't store xy bnd file */
  1200.                 savesc = 0;
  1201.                 break;
  1202.             case 'x':    /* use x file  
  1203.                 use[0] = 1;
  1204.                 break;
  1205.             case 'X':    /* don't use x file  */
  1206.                 use[0] = 0;
  1207.                 break;
  1208.             case 'y':    /* use y file */
  1209.                 use[1] = 1;
  1210.                 break;
  1211.             case 'Y':    /* don't use y file */
  1212.                 use[1] = 0;
  1213.                 break;
  1214.             case 'b':    /* don't blank display */
  1215.                 blank = 1;
  1216.                 break;
  1217.             case 'B':    /* blank display */
  1218.                 blank = 0;
  1219.                 break;
  1220.             case 't':    /* use tektronix */
  1221.                 dev = TEK;
  1222.                 break;
  1223.             case 'T':    /* use Retro-graphics */
  1224.                 dev = RETRO;
  1225.                 break;
  1226.             case 'h':    /* use hp plotter */
  1227.                 dev = HP;
  1228.                 break;
  1229.             case 'f':       /* frame plot */
  1230.                 frame = 1;
  1231.                 break;
  1232.             case 'F':       /* don't frame plot */
  1233.                 frame = 0;
  1234.                 break;
  1235.             case 'o':       /* g=stdout */
  1236.                 dev = STDOUT;
  1237.                 stfl = "-";
  1238.                 break;
  1239.             case 'v':       /* direct versatec mode */
  1240.                 dev = VERSATEC;
  1241.                 break;
  1242.             case 'P':    /* Use Plot package */
  1243.                 dev = PLOT;
  1244.                 break;
  1245.             case 'p':       /* direct line printer mode */
  1246.                 dev = PRINTRONIX;
  1247.                 break;
  1248.             case 'l':    /* prompt for axes labels */
  1249.                 prmpt = 1;
  1250.                 break;
  1251.             case 'L':    /* Don't prompt for axes labels */
  1252.                 prmpt = 0;
  1253.                 break;
  1254.             /* THIS SHOULD BE REMOVED SOMETIME LATER */
  1255.             case 'k':    /* Don't crosshatch (sic) surface */
  1256.                 ydir = 1;
  1257.                 xdir = 0;
  1258.                 break;
  1259.             case 'K':    /* Crosshatch (sic) surface */
  1260.                 xdir = 1;
  1261.                 ydir = 1;
  1262.                 break;
  1263.             case 'r':    /* Reverse Plot */
  1264.                 reverse = 1;
  1265.                 break;
  1266.             case 'R':    /* Do not reverse plot */
  1267.                 reverse = 0;
  1268.                 break;
  1269.             default:
  1270.                 fprintf(stderr,"bad flag: -%c\n",c);
  1271.                 exit(1);
  1272.             }
  1273.         else
  1274.             switch(i = comm(*argv)){
  1275.  
  1276.             case 1:    /* x input file name */
  1277.                 if(*xyf[0] == ',')xyf[0] = "x";
  1278.                 nbyte(*argv+2,&byte[0]);
  1279.                 use[0] = 1;
  1280.                 break;
  1281.             case 2:    /* y input file name */
  1282.                 if(*xyf[1] == ',')xyf[1] = "y";
  1283.                 nbyte(*argv+2,&byte[1]);
  1284.                 use[1] = 1;
  1285.                 break;
  1286.             case 3:    /* z input file name */
  1287.                 if(*zf == ',')zf = "z";
  1288.                 nbyte(*argv + 2,&byte[2]);
  1289.                 break;
  1290.             case 5:    /* output file name */
  1291.                 dev = STDOUT;
  1292.                  break;
  1293.             case 11:    /* Begin */
  1294.                 begin[1]=begin[0];
  1295.                 break;
  1296.             case 12:    /* set max or min value */
  1297.             case 13:
  1298.             case 14:
  1299.             case 15:
  1300.             case 16:
  1301.             case 17:
  1302.                 umxmn[i-12] = 1;
  1303.                 break;
  1304.             case 25:        /* site */
  1305.                 dev = PRINTRONIX;
  1306.                 break;
  1307.             case 20:    /* pen */
  1308.             case 26:    /* speed */
  1309.                 dev = HP;
  1310.                 break;
  1311.             case 30:    /* Phi 1 */
  1312.                 if (phi1 > 90 || phi1 < -90){
  1313.                     fprintf(stderr,"phi1 must be between -90 and 90 degrees.\n");
  1314.                     exit(2);
  1315.                 }
  1316.                 break;
  1317.             case 31:
  1318.                 if (phi2 > 90 || phi2 < -90){
  1319.                     fprintf(stderr,"phi2 must be between -90 and 90 degrees.\n");
  1320.                     exit(2);
  1321.                 }
  1322.                 break;
  1323.             case 33:    /* len */
  1324.                 len[1] = len[0];
  1325.                 len[2] = len[0];
  1326.                 break;
  1327.             case 34:    /* n */
  1328.                 xysize[1] = xysize[0];
  1329.                 break;
  1330.             case 35:    /* count */
  1331.                 count[1] = count[0];
  1332.                 break;
  1333.             case 38:    /* skip */
  1334.                 skip[1] = skip[0];
  1335.                 break;
  1336.             case 41:    /* size */
  1337.                 xysize[1] = xysize[0];
  1338.                 break;
  1339.             case 44:    /* dig */
  1340.                 dig[1] = dig[0];
  1341.                 dig[2] = dig[0];
  1342.                 break;
  1343.             case 48:    /* tic */
  1344.                 tic[1] = tic[0];
  1345.                 tic[2] = tic[0];
  1346.                 break;
  1347.             case 57:    /* Look up device name in dev table */
  1348.                 { struct devtable *tp;
  1349.                 for(tp=devtab; tp->devstr; tp++)
  1350.                     if(strcmp(tp->devstr,devstr) == 0)
  1351.                         break;
  1352.                 if(tp->devstr)
  1353.                     dev = tp->dev;
  1354.                 else
  1355.                     err("Unknown device ",devstr);
  1356.                 }
  1357.                 break;
  1358.             case 58:
  1359.                 dev = PLOT;
  1360.                 break;
  1361.             }
  1362.     }
  1363. }
  1364.  
  1365. args()
  1366. {
  1367.     char    *argv[20];
  1368.     int    argc;
  1369.     char    *s,*getenv(),*p;
  1370.  
  1371.     if((s=getenv("PLOT3DARGS")) == NULL)return;
  1372.  
  1373.     argv[0] = s;
  1374.     argc = 1;
  1375.     while(*s){
  1376.         while(*s == ' ')*s++ = 0;
  1377.         if(*s){
  1378.             if(*s != '"')argv[argc++] = s;
  1379.             else{
  1380.                 argv[argc++] = ++s;
  1381.                 while(*s){
  1382.                     if(*s != '"')s++;
  1383.                     else{
  1384.                         *s++ = 0;
  1385.                         break;
  1386.                     }
  1387.                 }
  1388.             }
  1389.         }
  1390.         while( (*s != ' ')  && *s){
  1391.             if(*s != '"')s++;
  1392.             else{
  1393.                 p = s;
  1394.                 while(*p){
  1395.                     *p = *(p+1);
  1396.                     p++;
  1397.                 }
  1398.                 while(*s){
  1399.                     if(*s != '"')s++;
  1400.                     else{
  1401.                         *s++ = 0;
  1402.                         break;
  1403.                     }
  1404.                 }
  1405.             }
  1406.         }
  1407.     }
  1408.     parse(argc,argv);
  1409. }
  1410.  
  1411. file()
  1412. {
  1413.     int    argc;
  1414.     char    *argv[20];
  1415.     static char buf[256];
  1416.     char    *b;
  1417.     char    *getenv(),*s;
  1418.     FILE    *dfd;
  1419.  
  1420.     if((s = getenv("HOME")) == NULL)return;
  1421.     strcpy(buf,s);
  1422.     strcat(buf,"/.plot3drc");
  1423.     if((dfd = fopen(buf,"r")) == NULL)return;
  1424.     argc = 1;
  1425.     b = buf;
  1426.     while(fgets(b,256-((int)(b - buf)),dfd) != NULL){
  1427.         b[strlen(b)-1] = 0;
  1428.         argv[argc++] = b;
  1429.         b += strlen(b)+1;
  1430.         if(argc == 20)break;
  1431.     }
  1432.     parse(argc,argv);
  1433.     fclose(dfd);
  1434. }
  1435.  
  1436. getlab(c,s)
  1437.     char    c,*s;
  1438. {
  1439.     printf("enter %c axis label: ",c);
  1440.     fgets(s,MLAB,stdin);
  1441.     if(s[strlen(s)-1] == '\n')s[strlen(s)-1] = 0;
  1442. }
  1443. SHAR_EOF
  1444. cat << \SHAR_EOF > qplot.c
  1445. /*
  1446.  * 
  1447.  *     qplot - program to plot vectors
  1448.  * 
  1449.  *    The CRC graphics package
  1450.  *
  1451.  *    Carl Crawford
  1452.  *    Purdue University
  1453.  *    W. Lafayette, Indiana
  1454.  *    April 3, 1979
  1455.  *
  1456.  *      compile with "cc -O qplot.c -i -lG -lm"
  1457.  */
  1458.  
  1459. #include    <stdio.h>
  1460. #include    <math.h>
  1461.  
  1462. #define    MLAB 80        /* maximum axes label size */
  1463.  
  1464. #ifndef    pdp
  1465. #define    MAX_POINTS    3072
  1466. #else
  1467. #define    MAX_POINTS    512
  1468. #endif
  1469.  
  1470. #define    DevNum(Major,Minor)    ((Major) + (Minor)*8)
  1471.  
  1472. #define    BIT    0    /* major device table */
  1473. #define GOV    1
  1474. #define IMAGE    2
  1475. #define    GGOV    3
  1476. #define    GIMAGE    4
  1477. #define    PLOT    5
  1478. #define    TEK    6
  1479. #define HP    7
  1480.  
  1481. #define    STDOUT        0    /* Special Device Numbers */
  1482. #define    VERSATEC    8
  1483. #define    PRINTRONIX    16
  1484. #define    RETRO        14
  1485. #define TEK4113        22
  1486.  
  1487. int    logx;        /* !=0 => x axis logrithmic */
  1488. int    logy;        /* !=0 => y axis logrithmic */
  1489. int    paxis    = 1;    /* 0=don't plot axis */
  1490. int     usey   = 1;     /* 1=use y file only */
  1491. float   scfac  = 1.0;   /* scale factor in plot */
  1492. char    *xf =   "x";    /* default x input file */
  1493. char    *yf =   "y";    /* default y input file */
  1494. char    *xyf =  "xybnd";/* default boundary file */
  1495. int    opsc;        /* 1= 'xyf' was openned */
  1496. int    dash;        /* 1= plot with dashed line */
  1497. float    xxs,yys;    /* starting locations for the graph */
  1498. int    spd = 36;    /* speed of hp plotter */
  1499. int    hist;        /* 1=use histogram mode */
  1500. int    savesc;        /* 1=save the generated scale file */
  1501. char    *xlp = NULL;    /* x axis label */
  1502. char    *ylp = NULL;    /* y axis label */
  1503. int    label;        /* 1=get labels from standard input */
  1504. char    xlab[MLAB];    /* buffer to hold x labels */
  1505. char    ylab[MLAB];    /* buffer to hold y labels */
  1506. char    *el;            /* end label */
  1507. char    *tl;        /* top label */
  1508. char    *bl;        /* bottom label */
  1509. char    *host;        /* host overide for all pipes */
  1510. float    height = 0.2;    /* character heights */
  1511. float    maxmin[4];    /* command string max,min values */
  1512. int    umxmn[4];    /* 1=corresponding maxmin value entered */
  1513. int     xbyte = 3;      /* default type for x vector */
  1514. int     ybyte = 5;      /* default type for y vector */
  1515. int     skip;           /* use every skip point in the vector */
  1516. long    begin;          /* start at vector point begin */
  1517. int     count = 512;    /* number of vector points to use */
  1518. int     pen   = 1;      /* hp pen color */
  1519. char    *stfl = "-";    /* default file for -p option */
  1520. float   xlen =  8.0;    /* length of x axis */
  1521. float   ylen =  8.0;    /* length of y axis */
  1522. int     frame;          /* 1=frame plot with border */
  1523. int    realx;        /* 1=real internal x vector */
  1524. int     xdigits = 6;    /* number of sig. digits for x axis */
  1525. int     ydigits = 6;    /* number of sig. digits for y axis */
  1526. int    online;        /* 1=use online symbols */
  1527. int     sym  =   4;     /* default online symbol */
  1528. int     jol  =  1;      /* default j for sline */
  1529. float   xtic =  1.0;    /* default x tic distance */
  1530. float   ytic =  1.0;    /* default y tic distance */
  1531. float   ds =    .1;     /* default dash length */
  1532. float   gp =    .1;     /* default gap length */
  1533. char    *siten = "pl";  /* default site for gplp */
  1534. int    blank;        /* blank flag */
  1535. int     devn;           /* minor device number */
  1536. int     dev = PRINTRONIX;/* major device number */
  1537. char    *devstr = 0;    /* dev= device string */
  1538. char    *plotstr = 0;    /* plot= device string */
  1539. char    *raxis = 0;    /* Use Real numbers to plot the named axis */
  1540. short    wasvalid = 0;    /* KLUDGE ALERT */
  1541.  
  1542. int     size[] = {
  1543.         sizeof(char),   /* signed char */
  1544.         sizeof(char),   /* unsigned char */
  1545.         sizeof(short),  /* short integer */
  1546.         sizeof(int),    /* integer */
  1547.         sizeof(long),   /* long integer */
  1548.         sizeof(float),  /* float */
  1549.         sizeof(double), /* double */
  1550.     };
  1551.  
  1552. #define INT     0
  1553. #define FLOAT   1
  1554. #define LONG    2
  1555. #define CHAR    3
  1556.  
  1557. struct hash  {
  1558.     char    *label;
  1559.     int     type;
  1560.     char    **pointer;
  1561.     } table[] = {
  1562. /* 1 */         {"x",CHAR,&xf},
  1563. /* 2 */         {"y",CHAR,&yf},
  1564. /* 3 */         {"s",CHAR,&xyf},
  1565. /* 4 */         {"g",CHAR,&stfl},
  1566. /* 5 */         {"xp",FLOAT,(char **)&xxs},
  1567. /* 6 */         {"yp",FLOAT,(char **)&yys},
  1568. /* 7 */         {"xl",CHAR,&xlp},
  1569. /* 8 */         {"yl",CHAR,&ylp},
  1570. /* 9 */         {"skip",INT,(char **)&skip},
  1571. /* 10 */        {"begin",LONG,(char **)&begin},
  1572. /* 11 */        {"xmin",FLOAT,(char **)&maxmin[0]},
  1573. /* 12 */        {"xmax",FLOAT,(char **)&maxmin[1]},
  1574. /* 13 */        {"ymin",FLOAT,(char **)&maxmin[2]},
  1575. /* 14 */        {"ymax",FLOAT,(char **)&maxmin[3]},
  1576. /* 15 */        {"count",INT,(char **)&count},
  1577. /* 16 */        {"pen",INT,(char **)&pen},
  1578. /* 17 */        {"scfac",FLOAT,(char **)&scfac},
  1579. /* 18 */        {"xlen",FLOAT,(char **)&xlen},
  1580. /* 19 */        {"ylen",FLOAT,(char **)&ylen},
  1581. /* 20 */        {"digits",INT,(char **)&xdigits},
  1582. /* 21 */        {"len",FLOAT,(char **)&xlen},
  1583. /* 22 */        {"el",CHAR,&el},
  1584. /* 23 */        {"sym",INT,(char **)&sym},
  1585. /* 24 */        {"j",INT,(char **)&jol},
  1586. /* 25 */        {"xdigits",INT,(char **)&xdigits},
  1587. /* 26 */        {"ydigits",INT,(char **)&ydigits},
  1588. /* 27 */        {"tic",FLOAT,(char **)&xtic},
  1589. /* 28 */        {"xtic",FLOAT,(char **)&xtic},
  1590. /* 29 */        {"ytic",FLOAT,(char **)&ytic},
  1591. /* 30 */        {"site",CHAR,&siten},
  1592. /* 31 */        {"dash",FLOAT,(char **)&ds},
  1593. /* 32 */        {"gap",FLOAT,(char **)&gp},
  1594. /* 33 */        {"dig",INT,(char **)&xdigits},
  1595. /* 34 */        {"xdig",INT,(char **)&xdigits},
  1596. /* 35 */        {"ydig",INT,(char **)&ydigits},
  1597. /* 36 */    {"speed",INT,(char **)&spd},
  1598. /* 37 */    {"tl",CHAR,&tl},
  1599. /* 38 */    {"bl",CHAR,&bl},
  1600. /* 39 */    {"logx",INT,(char **)&logx},
  1601. /* 40 */    {"logy",INT,(char **)&logy},
  1602. /* 41 */    {"op",CHAR,&host},
  1603. /* 42 */    {"dev",CHAR,&devstr},
  1604. /* 43 */    {"plot",CHAR,&plotstr},
  1605. /* 44 */    {"raxis",CHAR,&raxis},
  1606.         {0,0,0}
  1607.     };
  1608.  
  1609. struct    devtable {
  1610.     int    dev;
  1611.     char    *devstr;
  1612.         } devtab[] = {
  1613.         {TEK4113,"4113"},
  1614.         {0,0}
  1615.         };
  1616.  
  1617. main(argc,argv)
  1618.     int    argc;
  1619.     char    **argv;
  1620. {
  1621.     FILE    *fd;
  1622.     float   xd[MAX_POINTS+2],yd[MAX_POINTS+2];
  1623.     int    cx,cy;
  1624.     long    atol();
  1625.     float    max(),min();
  1626.     register int    i,j;
  1627.     float    dx,xtmp,ytmp,sftmp;
  1628.     char    buf[10];
  1629.  
  1630.     bzero(buf, sizeof(buf));
  1631.     gethostname(buf, sizeof(buf)-1);
  1632.     if(strcmp(buf,"arpa") == 0)
  1633.         dev = DevNum(GOV,0);
  1634.     file();
  1635.     args();
  1636.     parse(argc,argv);
  1637.     if(abs(logy) > 3 || abs(logx) > 3)err("illegal logy or logx value","");
  1638.     if(count > MAX_POINTS) 
  1639.         count = MAX_POINTS;
  1640.     if(begin < 0)begin *= (-count);
  1641.     cy = input(yf,ybyte,yd);
  1642.     if( !usey ){
  1643.         cx = input(xf,xbyte,xd);
  1644.         if(cx != cy)err("x and y vectors have different length","");
  1645.     }
  1646.     if( (fd = fopen(xyf,"r")) == NULL){
  1647.         scale(yd,cy);
  1648.         if( !usey ) scale(xd,cy);
  1649.     }else{
  1650.         fscanf(fd,"%f%f%f%f",xd+cy,xd+cy+1,yd+cy,yd+cy+1);
  1651.         fclose(fd);
  1652.         opsc = 1;
  1653.     }
  1654.     if(umxmn[0]){
  1655.         xd[cy] = maxmin[0];
  1656.     }else{
  1657.         if(opsc){
  1658.             umxmn[0] = 1;
  1659.             maxmin[0] = xd[cy];
  1660.         }
  1661.     }
  1662.     if(umxmn[1]){
  1663.         xd[cy+1] = maxmin[1];
  1664.     }else{
  1665.         if(opsc){
  1666.             umxmn[1] = 1;
  1667.             maxmin[1] = xd[cy+1];
  1668.         }
  1669.     }
  1670.     if(umxmn[2])yd[cy] = maxmin[2];
  1671.     if(umxmn[3])yd[cy+1] = maxmin[3];
  1672.  
  1673.     if(usey){
  1674.         if(umxmn[0] && umxmn[1]){
  1675.             dx = (maxmin[1] - maxmin[0])/(cy -1);
  1676.             xd[0] = maxmin[0];
  1677.             for(i=1;i<cy;i++)xd[i] = xd[i-1] + dx;
  1678.             if(realx)xbyte = 5;
  1679.         }else{
  1680.             if(umxmn[0]){
  1681.                 for(i=0,j= -skip -1;i<cy;xd[i++] = maxmin[0] + (j += skip + 1));
  1682.                 xd[cy] = maxmin[0];
  1683.                 xd[cy+1] = xd[cy-1];
  1684.             }else{
  1685.                 for(i=0,j= -skip -1;i<cy;xd[i++] = begin + (j += skip + 1));
  1686.                 xd[cy] = begin;
  1687.                 xd[cy+1] = xd[cy-1];
  1688.             }
  1689.         }
  1690.     }
  1691.     if(xbyte <= 4 && !(umxmn[0] && umxmn[1])){
  1692.         i = floor(xlen / xtic);
  1693.         xd[cy+1] = ceil((xd[cy+1] - xd[cy])/i)*i + xd[cy];
  1694.     }
  1695.     if(ybyte <= 4){
  1696.         i = floor(ylen / ytic);
  1697.         yd[cy+1] = ceil((yd[cy+1] - yd[cy])/i)*i + yd[cy];
  1698.     }
  1699.     if(label && paxis){
  1700.         if(xlp == NULL){
  1701.             getlab('x',xlab);
  1702.             xlp = xlab;
  1703.         }
  1704.         if(ylp == NULL){
  1705.             getlab('y',ylab);
  1706.             ylp = ylab;
  1707.         }
  1708.     }
  1709.     /* Added to keep from dereferencing a NULL pointer later. --kcd */
  1710.     if(xlp == NULL){
  1711.         xlab[0] = '\0';
  1712.         xlp = xlab;
  1713.     }
  1714.     if(ylp == NULL){
  1715.         ylab[0] = '\0';
  1716.         ylp = ylab;
  1717.     }
  1718.     if(savesc){
  1719.         if((fd=fopen(xyf,"w")) == NULL)err("can't create: ",xyf);
  1720.         fprintf(fd,"%e %e %e %e\n",xd[cy],xd[cy+1],yd[cy],yd[cy+1]);
  1721.         fclose(fd);
  1722.     }
  1723.  
  1724.     if (logx < 0) {
  1725.         for (i=0; i <= cy+1; i++){
  1726.             if(xd[i] <= 0)err("data value <= 0 in x vector","");
  1727.             xd[i] = log10( (double) xd[i]);
  1728.         }
  1729.         xd[cy] = floor( (double) xd[cy]);
  1730.         xd[cy+1] = ceil( (double) xd[cy+1]);
  1731.         logx = -logx;
  1732.     }
  1733.     if (logy < 0) {
  1734.         for (i=0; i <= cy+1; i++){
  1735.             if(yd[i] <= 0)err("data value <= 0 in y vector","");
  1736.             yd[i] = log10( (double) yd[i]);
  1737.         }
  1738.         yd[cy] = floor( (double) yd[cy]);
  1739.         yd[cy+1] = ceil( (double) yd[cy+1]);
  1740.         logy = -logy;
  1741.     }
  1742.  
  1743.     for(i=0;i<cy;i++) {
  1744.         if (yd[i] != max(min(yd[i],yd[cy+1]),yd[cy])) {
  1745.             if (wasvalid) {
  1746.                 wasvalid = 0;
  1747.                 if (yd[i] < yd[cy]) 
  1748.                     xd[i]=xd[i-1]+
  1749.                           ((yd[cy]-yd[i-1])*(xd[i]-xd[i-1]))
  1750.                           / (yd[i]-yd[i-1]);
  1751.                 else 
  1752.                     xd[i]=xd[i-1]+
  1753.                           ((yd[cy+1]-yd[i-1])*(xd[i]-xd[i-1]))
  1754.                           / (yd[i]-yd[i-1]);
  1755.             } 
  1756.             yd[i] = max(min(yd[i],yd[cy+1]),yd[cy]); 
  1757.         } else 
  1758.             wasvalid = 1;
  1759.     }
  1760.  
  1761.     if(dev == DevNum(GOV,0) || dev == DevNum(IMAGE,0) ||
  1762.         dev == DevNum(GGOV,0) || dev == DevNum(GIMAGE,0)){
  1763.         if(devn){
  1764.             devn -= '0';
  1765.             if(dev == DevNum(IMAGE,0) || dev == DevNum(GIMAGE,0))
  1766.                 devn += 1;
  1767.         }
  1768.         dev |= devn << 3;
  1769.     }
  1770.     strcpy(buf,"-");
  1771.     strcat(buf,siten);
  1772.     site(buf);
  1773.     fname(stfl);
  1774.     if(host || (dev == PLOT && plotstr))
  1775.         dev |= 0100;
  1776.     if (host)
  1777.         plots(dev,blank,host);
  1778.     else if (dev == 0100 | PLOT)
  1779.         plots(dev,blank,plotstr);
  1780.     else
  1781.         plots(dev,blank,NULL);
  1782.     newpen(pen);
  1783.     speed(spd);
  1784.     plot(xxs,yys,-3);
  1785.     factor(scfac);
  1786.     if(paxis){
  1787.         int    FloatX, FloatY;
  1788.  
  1789.         FloatX = (raxis && index(raxis,'x')) || (xbyte > 4);
  1790.         FloatY = (raxis && index(raxis,'y')) || (ybyte > 4);
  1791.  
  1792.         axisv(xtic,xdigits);
  1793.         if (logx)
  1794.             laxis(1.5,1.5,xlp,0,xlen, (int) xd[cy], (int) xd[cy+1],logx);
  1795.         else
  1796.             axis(1.5,1.5,xlp,0,xlen,xd[cy],xd[cy+1],!FloatX);
  1797.         axisv(ytic,ydigits);
  1798.         if (logy)
  1799.             laxis(1.5,1.5,ylp,1,ylen, (int) yd[cy], (int) yd[cy+1],logy);
  1800.         else
  1801.             axis(1.5,1.5,ylp,1,ylen,yd[cy],yd[cy+1],!FloatY);
  1802.     }
  1803.     plot(1.5,1.5,-3);
  1804.     if(frame && paxis){
  1805.         plot(0.0,ylen,3);
  1806.         plot(xlen,ylen,2);
  1807.         plot(xlen,0.0,2);
  1808.     }
  1809.     else if (frame) {
  1810.         plot(0.0,0.0,3);
  1811.         plot(0.0,ylen,2);
  1812.         plot(xlen,ylen,2);
  1813.         plot(xlen,0.0,2);
  1814.         plot(0.0,0.0,2);
  1815.     }
  1816.     if( !dash ){
  1817.         if(online){
  1818.             sline(xd,yd,cy,xlen,ylen,jol,sym);
  1819.         }else{
  1820.             line(xd,yd,cy,hist,xlen,ylen);
  1821.         }
  1822.     }else{
  1823.         dline(xd,yd,cy,&ds,&gp,1,xlen,ylen);
  1824.     }
  1825.     if(el){        /* end label */
  1826.         where(&xtmp,&ytmp,&sftmp);
  1827.         symbol((xtmp+.1)/sftmp,(ytmp-.1)/sftmp,height,el,0.0);
  1828.     }
  1829.     if(tl){        /* top label */
  1830.         symbol(xlen*0.5-(3./7.*_ssize(tl)*height),ylen+height*0.5,height,tl,0.0);
  1831.     }
  1832.     if(bl){        /* bottom label */
  1833.         symbol(xlen*0.5-(3./7.*_ssize(bl)*height),-1.1,height,bl,0.0);
  1834.     }
  1835.     plot(0.0,0.0,999);
  1836.     exit(0);
  1837. }
  1838.  
  1839.  
  1840. float    max(x,y)
  1841.     float    x,y;
  1842. {
  1843.     return( (x > y)? x : y);
  1844. }
  1845.  
  1846. float    min(x,y)
  1847.     float    x,y;
  1848. {
  1849.     return( (x < y)? x : y);
  1850. }
  1851.  
  1852. input(name,n,vec)
  1853.     char    *name;
  1854.     int    n;
  1855.     float    *vec;
  1856. {
  1857.     register int    i,ns;
  1858.     FILE    *fd;
  1859.     char    buf[sizeof(double)];
  1860. #ifdef sel
  1861.     double  vec2;
  1862. #endif
  1863.  
  1864.     if( (fd = fopen(name,"r")) == NULL){
  1865.         fprintf(stderr,"can't open: %s\n",name);
  1866.         exit(1);
  1867.     }
  1868.     if (n == 7){
  1869.         int    j;
  1870.         float    x;
  1871.  
  1872.         i = begin;
  1873.         while ( i-- > 0 && fscanf(fd,"%f",&x) > 0);
  1874.         i = 0;
  1875.         while (i < count && fscanf(fd,"%f",&x) > 0){
  1876.             *vec++ = x;
  1877.             i++;
  1878.             for (j=0;j<skip && fscanf(fd,"%f",&x) > 0;j++);
  1879.         }
  1880.     }
  1881.     else {
  1882.         i = 0;
  1883.         ns = size[n];
  1884.         fseek(fd,(long)(begin * ns),0);
  1885.         while((i<count) && (fread(buf,ns,1,fd) != 0)){
  1886.             switch(n){
  1887.  
  1888.             case 0: /* signed char */
  1889.                 *vec++ = *((char *)buf);
  1890.                 break;
  1891.             case 1: /* unsigned char */
  1892.                 *vec++ = *((char *)buf) & 0377;
  1893.                 break;
  1894.             case 2: /* short */
  1895.                 *vec++ = *((short *)buf);
  1896.                 break;
  1897.             case 3: /* int */
  1898.                 *vec++ = *((int *)buf);
  1899.                 break;
  1900.             case 4: /* long */
  1901.                 *vec++ = *((long *)buf);
  1902.                 break;
  1903.             case 5: /* float */
  1904.                 *vec++ = *((float *)buf);
  1905.                 break;
  1906.             case 6: /* double */
  1907. #ifdef sel
  1908.                 bcopy(buf,(char *)&vec2,sizeof(double));
  1909.                 *vec++ = vec2;
  1910. #else
  1911.                 *vec++ = *((double *)buf);
  1912. #endif
  1913.                 break;
  1914.             }
  1915.             i++;
  1916.             fseek(fd,(long)(skip*ns),1);
  1917.         }
  1918.     }
  1919.     fclose(fd);
  1920.     if(i == 0){
  1921.         fprintf(stderr,"no points read from input file\n");
  1922.         exit(1);
  1923.     }
  1924.     return(i);
  1925. }
  1926.  
  1927.  
  1928. nbyte(s,n)
  1929.     char    *s;
  1930.     int    *n;
  1931. {
  1932.     while(*s)if(*s == ',' && *(s+1)){
  1933.         *s++ = 0;
  1934.         switch(*s){
  1935.  
  1936.         case 'b':       /* char data */
  1937.         case 'c':
  1938.         case '1':
  1939.             if(*++s == 's')*n = 0;
  1940.             else *n = 1;
  1941.             return;
  1942.         case 's':       /* short */
  1943.         case '2':
  1944.             *n = 2;
  1945.             return;
  1946.         case 'i':       /* integer */
  1947.             *n = 3;
  1948.             return;
  1949.         case 'l':       /* long */
  1950.             *n = 4;
  1951.             return;
  1952.         case 'f':       /* float */
  1953.         case '4':
  1954.             *n = 5;
  1955.             return;
  1956.         case 'd':       /* double */
  1957.         case '8':
  1958.             *n = 6;
  1959.             return;
  1960.         case 'a':    /* ASCII */
  1961.             *n = 7;
  1962.             return;
  1963.         default:
  1964.             err("byte declaration error","");
  1965.         }
  1966.     }else{
  1967.         s++;
  1968.     }
  1969. }
  1970.  
  1971. err(s1,s2)
  1972.     char    *s1,*s2;
  1973. {
  1974.     fprintf(stderr,"%s%s\n",s1,s2);
  1975.     exit(1);
  1976. }
  1977.  
  1978. comm(s)
  1979.     char    *s;
  1980. {
  1981.     register    int    j,r;
  1982.     char    *p;
  1983.     struct hash *hp;
  1984.  
  1985.  
  1986.     for(hp=table;hp->label;hp++){
  1987.         for(j=0;(r=hp->label[j]) == s[j] && r;j++);
  1988.         if(r == 0 && s[j] == '=')
  1989.             if(!s[j+1]){
  1990.                 s[j] = 0;
  1991.                 err("empty string: ",s);
  1992.             }else{
  1993.                 switch(hp->type){
  1994.  
  1995.                 case CHAR:
  1996.                     *hp->pointer = s + j + 1;
  1997.                     break;
  1998.                 case INT:
  1999.                     *((int *)hp->pointer) = atoi(s+j+1);
  2000.                     break;
  2001.                 case FLOAT:
  2002.                     *((float *)hp->pointer) = atof(s+j+1);
  2003.                     break;
  2004.                 case LONG:
  2005.                     *((long *)hp->pointer) = atol(s+j+1);
  2006.                     break;
  2007.                 }
  2008.                 return(hp - table + 1);
  2009.             }
  2010.     }
  2011.     p = s;
  2012.     while(*p){
  2013.         if(*p == '='){
  2014.             *p = 0;
  2015.             break;
  2016.         }
  2017.         p++;
  2018.     }
  2019.     err("bad option: ",s);
  2020. }
  2021.  
  2022.  
  2023. parse(argc,argv)
  2024.     int    argc;
  2025.     char    **argv;
  2026. {
  2027.     char    c;
  2028.     int     i;
  2029.  
  2030.     while(argv++ , --argc){
  2031.         if(argv[0][0] == '-')while(c = *++*argv)switch(c){
  2032.  
  2033.             case '0':    /* device # */
  2034.             case '1':
  2035.             case '2':
  2036.             case '3':       /* grinell */
  2037.             case '4':
  2038.                 devn = c;
  2039.                 break;
  2040.             case 'G':
  2041.                 if (dev == IMAGE || dev == GIMAGE)
  2042.                     dev = GIMAGE;
  2043.                 else
  2044.                     dev = GGOV;
  2045.                 break;
  2046.             case 'a':    /* don't plot axis */
  2047.                 paxis = 0;
  2048.                 break;
  2049.             case 'A':    /* plot axis */
  2050.                 paxis = 1;
  2051.                 break;
  2052.             case 'g':    /* use graphics overlay */
  2053.                 if (dev == GGOV || dev == GIMAGE)
  2054.                     dev = GGOV;
  2055.                 else
  2056.                     dev = GOV;
  2057.                 break;
  2058.             case 'i':    /* use Image Plane */
  2059.                 if (dev == GGOV || dev == GIMAGE)
  2060.                     dev = GIMAGE;
  2061.                 else
  2062.                     dev = IMAGE;
  2063.                 break;
  2064.             case 'c':    /* use comtal */
  2065.                 if (dev == GIMAGE || dev == IMAGE)
  2066.                     dev = IMAGE;
  2067.                 else
  2068.                     dev = GOV;
  2069.                 break;
  2070.             case 's':    /* store xy bnd file */
  2071.                 savesc = 1;
  2072.                 break;
  2073.             case 'S':    /* don't store xy bnd file */
  2074.                 savesc = 0;
  2075.                 break;
  2076.             case 'x':    /* use x and y file  */
  2077.                 usey = 0;
  2078.                 break;
  2079.             case 'X':    /* don't use x and y file  */
  2080.                 usey = 1;
  2081.                 break;
  2082.             case 'd':    /* use dash line */
  2083.                 dash = 1;
  2084.                 break;
  2085.             case 'D':    /* don't use dash line */
  2086.                 dash = 0;
  2087.                 break;
  2088.             case 'b':    /* don't blank display */
  2089.                 blank = 1;
  2090.                 break;
  2091.             case 'B':    /* blank display */
  2092.                 blank = 0;
  2093.                 break;
  2094.             case 'z':    /*use histogram mode */
  2095.                 hist = 1;
  2096.                 break;
  2097.             case 'Z':    /* don't use histogram mode */
  2098.                 hist = 0;
  2099.                 break;
  2100.             case 't':    /* use tektronix */
  2101.                 dev = TEK;
  2102.                 break;
  2103.             case 'T':    /* use Retro-graphics */
  2104.                 dev = RETRO;
  2105.                 break;
  2106.             case 'h':    /* use hp plotter */
  2107.                 dev = HP;
  2108.                 break;
  2109.             case 'f':       /* frame plot */
  2110.                 frame = 1;
  2111.                 break;
  2112.             case 'F':       /* don't frame plot */
  2113.                 frame = 0;
  2114.                 break;
  2115.             case 'o':       /* g=stdout */
  2116.                 dev = STDOUT;
  2117.                 stfl = "-";
  2118.                 break;
  2119.             case 'r':    /* real x generated vector */
  2120.                 realx = 1;
  2121.                 break;
  2122.             case 'R':    /* integer x generated vector */
  2123.                 realx = 0;
  2124.                 break;
  2125.             case 'm':    /* use on line symbols */
  2126.                 online = 1;
  2127.                 break;
  2128.             case 'M':    /* don't use on line symbols */
  2129.                 online = 0;
  2130.                 break;
  2131.             case 'v':       /* direct versatec mode */
  2132.                 dev = VERSATEC;
  2133.                 break;
  2134.             case 'P':    /* Plot Subroutines */
  2135.                 dev = PLOT;
  2136.                 break;
  2137.             case 'p':       /* direct line printer mode */
  2138.                 dev = PRINTRONIX;
  2139.                 break;
  2140.             case 'l':    /* get labels from standard input */
  2141.                 label = 1;
  2142.                 break;
  2143.             case 'L':    /* don't get labels */
  2144.                 label = 0;
  2145.                 break;
  2146.             default:
  2147.                 fprintf(stderr,"bad flag: -%c\n",c);
  2148.                 exit(1);
  2149.             }
  2150.         else
  2151.             switch(i = comm(*argv)){
  2152.  
  2153.             case 1:    /* x input file name */
  2154.                 if(*xf == ',')xf = "x";
  2155.                 nbyte(*argv+2,&xbyte);
  2156.                 usey = 0;
  2157.                 break;
  2158.             case 2:    /* y input file name */
  2159.                 if(*yf == ',')yf = "y";
  2160.                 nbyte(*argv + 2,&ybyte);
  2161.                 break;
  2162.             case 4:    /* output file name */
  2163.                 dev = STDOUT;
  2164.                  break;
  2165.             case 11:    /* set max or min value */
  2166.             case 12:
  2167.             case 13:
  2168.             case 14:
  2169.                 umxmn[i-11] = 1;
  2170.                 break;
  2171.             case 36:    /* speed */
  2172.                 dev = HP;
  2173.                 break;
  2174.             case 20:        /* digits for axes */
  2175.             case 33:
  2176.                 ydigits = xdigits;
  2177.                 break;
  2178.             case 21:    /* x and y axis length */
  2179.                 ylen = xlen;
  2180.                 break;
  2181.             case 23:    /* sym */
  2182.             case 24:    /* j for online symbol */
  2183.                 online = 1;
  2184.                 break;
  2185.             case 27:    /* tic */
  2186.                 ytic = xtic;
  2187.                 break;
  2188.             case 30:        /* site */
  2189.                 dev = PRINTRONIX;
  2190.                 break;
  2191.             case 31:        /* dash */
  2192.             case 32:        /* gap */
  2193.                 dash = 1;
  2194.                 break;
  2195.             case 42:    /* Look up device name in dev table */
  2196.                 { struct devtable *tp;
  2197.                 for(tp=devtab; tp->devstr; tp++)
  2198.                     if(strcmp(tp->devstr,devstr) == 0)
  2199.                         break;
  2200.                 if(tp->devstr)
  2201.                     dev = tp->dev;
  2202.                 else
  2203.                     err("Unknown device ",devstr);
  2204.                 }
  2205.                 break;
  2206.             case 43:
  2207.                 dev = PLOT;
  2208.                 break;
  2209.                 
  2210.             }
  2211.     }
  2212. }
  2213.  
  2214. args()
  2215. {
  2216.     char    *argv[20];
  2217.     int    argc;
  2218.     char    *s,*getenv(),*p;
  2219.  
  2220.     if((s=getenv("QPLOTARGS")) == NULL)return;
  2221.  
  2222.     argv[0] = s;
  2223.     argc = 1;
  2224.     while(*s){
  2225.         while(*s == ' ')*s++ = 0;
  2226.         if(*s){
  2227.             if(*s != '"')argv[argc++] = s;
  2228.             else{
  2229.                 argv[argc++] = ++s;
  2230.                 while(*s){
  2231.                     if(*s != '"')s++;
  2232.                     else{
  2233.                         *s++ = 0;
  2234.                         break;
  2235.                     }
  2236.                 }
  2237.             }
  2238.         }
  2239.         while( (*s != ' ')  && *s){
  2240.             if(*s != '"')s++;
  2241.             else{
  2242.                 p = s;
  2243.                 while(*p){
  2244.                     *p = *(p+1);
  2245.                     p++;
  2246.                 }
  2247.                 while(*s){
  2248.                     if(*s != '"')s++;
  2249.                     else{
  2250.                         *s++ = 0;
  2251.                         break;
  2252.                     }
  2253.                 }
  2254.             }
  2255.         }
  2256.     }
  2257.     parse(argc,argv);
  2258. }
  2259.  
  2260. file()
  2261. {
  2262.     int    argc;
  2263.     char    *argv[20];
  2264.     static char buf[256];
  2265.     char    *b;
  2266.     char    *getenv(),*s;
  2267.     FILE    *dfd;
  2268.  
  2269.     if((s = getenv("HOME")) == NULL)return;
  2270.     strcpy(buf,s);
  2271.     strcat(buf,"/.qplotrc");
  2272.     if((dfd = fopen(buf,"r")) == NULL)return;
  2273.     argc = 1;
  2274.     b = buf;
  2275.     while(fgets(b,256-((int)(b - buf)),dfd) != NULL){
  2276.         b[strlen(b)-1] = 0;
  2277.         argv[argc++] = b;
  2278.         b += strlen(b)+1;
  2279.         if(argc == 20)break;
  2280.     }
  2281.     parse(argc,argv);
  2282.     fclose(dfd);
  2283. }
  2284.  
  2285. getlab(c,s)
  2286.     char    c,*s;
  2287. {
  2288.     printf("enter %c axis label: ",c);
  2289.     fgets(s,MLAB,stdin);
  2290.     if(s[strlen(s)-1] == '\n')s[strlen(s)-1] = 0;
  2291. }
  2292. SHAR_EOF
  2293. chdir ..
  2294. #    End of shell archive
  2295. exit 0
  2296.  
  2297. -- 
  2298.  
  2299. Rich $alz            "Anger is an energy"
  2300. Cronus Project, BBN Labs    rsalz@bbn.com
  2301. Moderator, comp.sources.unix    sources@uunet.uu.net
  2302.