home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / modcomp / getlin. < prev    next >
Text File  |  2020-01-01  |  8KB  |  279 lines

  1.       INTEGER FUNCTION GETLIN (ALIN,CH)
  2. C
  3. C     ****************************************************************
  4. C
  5. C              KERMIT for the MODCOMP MAXIV operating system
  6. C
  7. C        Compliments of:
  8. C
  9. C                         SETPOINT, Inc.
  10. C                      10245 Brecksville Rd.
  11. C                      Brecksville, Ohio 44141
  12. C
  13. C
  14. C      KERMIT is a copyrighted protocol of Columbia Univ. The authors
  15. C      of this version hereby grant permission to copy this software
  16. C      provided that it is not used for an explicitly commercial
  17. C      purpose and that proper credit be given. SETPOINT, Inc. makes
  18. C      no warranty whatsoever regarding the accuracy of this package
  19. C      and will assume no liability resulting from it's use.
  20. C
  21. C     ****************************************************************
  22. C
  23. C     Abstract:  Read a line from the specified UFT and unpack the
  24. C                bytes.
  25. C
  26. C     MODIFICATION HISTORY
  27. C
  28. C     BY            DATE     REASON            PROGRAMS AFFECTED
  29. C
  30. C     ****************************************************************
  31. C
  32. C     Author:  Rick Burke           Version: A.0    Date: Aug-86
  33. C
  34. C     Calling Parameters:
  35. C
  36. C     W    ALIN         - Line of input data to return to caller
  37. C                         Each word contains 1 byte of data, right
  38. C                         justified in the word.
  39. C     R    CH           - UFT number to use for the read;
  40. C                         2 = user's terminal
  41. C
  42. C     ****************************************************************
  43. C
  44. C     Messages generated by this module :  None
  45. C
  46. C     ****************************************************************
  47. C
  48. C     Subroutines called directly :  IAND, ISHFT, READ4, WAIT
  49. C
  50. C     ****************************************************************
  51. C
  52. C     Files referenced :  None
  53. C
  54. C     ****************************************************************
  55. C
  56. C     Local variable definitions :
  57. C
  58. C     ACOUNT       - Index counter for ALIN array.
  59. C     BCOUNT       - Index counter for BLIN array.
  60. C     I            - Index variable
  61. C     LEFT         - Flag to indicate that the left byte should be
  62. C                    processed
  63. C     MAXTRY       - # OF TIMES TO WAIT BEFORE TIMEOUT
  64. C     MLEFT        - Mask to extract the left byte of a word
  65. C     MRIGHT       - Mask to extract the right byte of a word
  66. C     NSCH         - UFT # FOR BINARY READ
  67. C     RIGHT        - Flag to indicate that the right byte should be
  68. C                    processed
  69. C     TRYTIM       - MAGNITUDE OF WAIT
  70. C     TRYUNT       - TIME UNIT FOR WAIT (SECONDS,TICKS, ETC)
  71. C     TV1          - Temporary variable
  72. C     TV2          - Temporary variable
  73. C     WHICHS       - Flag for which byte to extract
  74. C     BLIN(132)    - Input line read from I/O device which is to
  75. C                    be unpacked
  76. C     LEOL         - OUR EOL CHAR SHIFTED TO MSB
  77. C     UEOL         - BIT MASK CHOSEN TO SEARCH FOR EOL
  78. C     OLDCHN       - STORAGE FOR OLD READ #
  79. C     IPNT         - POINTER TO WORD WHERE WE EXPECT EOL
  80. C     NTFLO        - # OF CHAR TO FOLLOW (SECOND BYTE OF PACKET)
  81. C     TIMED        - FLAG FOR READ HAS TIMED OUT (IF = 1)
  82. C
  83. C     ****************************************************************
  84. C
  85. C     Commons referenced :  KERPAR and UFTTBL local commons
  86. C
  87. C     ****************************************************************
  88. C
  89. C     (*$END.DOCUMENT*)
  90. C
  91. C     ****************************************************************
  92. C     *                                                              *
  93. C     *         D I M E N S I O N   S T A T E M E N T S              *
  94. C     *                                                              *
  95. C     ****************************************************************
  96. C
  97.       IMPLICIT INTEGER (A-Z)
  98.       INTEGER*2   ALIN(1)
  99. C
  100. C     ****************************************************************
  101. C     *                                                              *
  102. C     *         T Y P E   S T A T E M E N T S                        *
  103. C     *                                                              *
  104. C     ****************************************************************
  105. C
  106. C
  107. C     ****************************************************************
  108. C     *                                                              *
  109. C     *         C O M M O N   S T A T E M E N T S                    *
  110. C     *                                                              *
  111. C     ****************************************************************
  112. C
  113.       INCLUDE USL/KERCOM
  114. C
  115.       INCLUDE USL/KERPMC
  116. C
  117.       INCLUDE USL/UFTTBC
  118. C
  119. C     ****************************************************************
  120. C     *                                                              *
  121. C     *         E Q U I V A L E N C E   S T A T E M E N T S          *
  122. C     *                                                              *
  123. C     ****************************************************************
  124. C
  125. C
  126. C     ****************************************************************
  127. C     *                                                              *
  128. C     *         D A T A   S T A T E M E N T S                        *
  129. C     *                                                              *
  130. C     ****************************************************************
  131. C
  132.       DATA        MLEFT /ZFF00/,            MRIGHT /Z00FF/
  133.      >          , TRYTIM / 200 /
  134.      >          , TRYUNT/ 1 /  ,            NSCH  / 10 /
  135. C
  136. C     ****************************************************************
  137. C
  138. C     Code starts here :
  139. C
  140. C----->  Initialize the line buffers.
  141. C
  142.       DO 10 I=1,132
  143.       ALIN(I) = 0
  144.    10 CONTINUE
  145. C
  146. C----->  Initialize some local variables.
  147. C
  148.       LEFT = 1
  149.       RIGHT = 2
  150.       WHICHS = LEFT
  151.       ACOUNT = 1
  152.       BCOUNT = 1
  153.       LEOL = ISHFT(EOL,8)
  154.       TIMED = 0
  155. C
  156. C---->    ALL INPUT IS ON UFT 4
  157. C
  158.       UFT = 4
  159. C
  160. C----->  Get the input line and check for an EOF event.
  161. C
  162.       DO 1000 I = 1,20
  163. C
  164. C----->        IF NO CHARACTERS HAVE BEEN READ , LOOP
  165. C
  166.         IF(IAND(IUFT(1,UFT),8) .NE. 0)GO TO 950
  167. C
  168. C----->        GET # OF CHARACTERS TO FOLLOW IN PACKET + EOL
  169. C
  170.         NTFLO = UNCHAR(IAND(BLIN(1,CURCHN),MRIGHT)) + 1
  171.         IF(NTFLO .EQ. -31)GO TO 950
  172. C
  173. C----->        CHOOSE BITMASK TO LOOK FOR EOL
  174. C
  175.         UEOL = LEOL
  176.         IF(MOD(NTFLO,2).EQ.0)UEOL = EOL
  177. C
  178. C----->        CALCULATE WHICH WORD EOL SHOULD BE IN
  179. C
  180.         IPNT = (NTFLO + 1) / 2 + 1
  181. C
  182.         IF(IAND(BLIN(IPNT,CURCHN),UEOL) .EQ. UEOL)GO TO 15
  183. C
  184. C----->        PACKET IS NOT THERE (OR NOT COMPLETE) SO WAIT
  185. C
  186.   950   CONTINUE
  187. C
  188.         CALL WAIT(TRYTIM,TRYUNT,IND)
  189. C
  190.  1000 CONTINUE
  191. C
  192. C----->        WE HAVE TIMED OUT
  193. C
  194.       GETLIN = BAD
  195.       TIMED = 1
  196.       GO TO 1800
  197. C
  198.    15 CONTINUE
  199. C
  200. C----->        GOT A PACKET !!!
  201. C
  202. C
  203. C     IF (IAND (IUFT(1,UFT),4Z0020) .NE. 0) GO TO 100
  204. C
  205. C----->       START NEW READ, TERMINATE OLD, AND UNPACK
  206. C
  207. C
  208.  1800 CONTINUE
  209. C
  210.       IF(CURCHN .NE. 1)GO TO 2000
  211. C
  212.         DO 1900 I = 132
  213. C
  214.           BLIN(I,2) = 0
  215. C
  216.  1900   CONTINUE
  217. C
  218.         CALL TERMIN (IUFT(1,UFT),.FALSE.)
  219.         CALL READ4(IUFT(1,UFT),BLIN(1,2),132,.FALSE.)
  220.         OLDCHN = CURCHN
  221.         CURCHN = 2
  222.         IF(TIMED .EQ. 1)RETURN
  223.         GO TO 20
  224. C
  225.  2000 CONTINUE
  226. C
  227.         DO 2100 I = 1,132
  228. C
  229.           BLIN(I,1) = 0
  230. C
  231.  2100   CONTINUE
  232.         CALL TERMIN (IUFT(1,UFT),.FALSE.)
  233.         CALL READ4(IUFT(1,UFT),BLIN(1,1),132,.FALSE.)
  234.         OLDCHN = CURCHN
  235.         CURCHN = 1
  236.         IF(TIMED .EQ. 1)RETURN
  237. C
  238. C----->  Unpack the input line.
  239. C
  240.    20 CONTINUE
  241.       IF (WHICHS .NE. RIGHT) GO TO 40
  242. C
  243. C----->  Move a char in the right byte of BLIN to a word in ALIN,
  244. C----->  unless we are finished processing the input line.
  245. C
  246.       TV1 = IAND (BLIN(BCOUNT,OLDCHN),MRIGHT)
  247.       IF (TV1 .NE. 0) GO TO 30
  248.       ALIN(ACOUNT) = LF
  249.       ALIN(ACOUNT+1) = EOS
  250.       GETLIN = OK
  251.       RETURN
  252.    30 CONTINUE
  253.       ALIN(ACOUNT) = TV1
  254.       ACOUNT = ACOUNT + 1
  255.       BCOUNT = BCOUNT + 1
  256.       WHICHS = LEFT
  257.    40 CONTINUE
  258. C
  259. C----->  Move a char in the left byte of BLIN to a word in ALIN,
  260. C----->  unless we are finished processing the input line.
  261. C
  262.       TV1 = IAND (BLIN(BCOUNT,OLDCHN),MLEFT)
  263.       TV2 = ISHFT (TV1,-8)
  264.       IF (TV2 .NE. 0) GO TO 50
  265.       ALIN(ACOUNT) = LF
  266.       ALIN(ACOUNT+1) = EOS
  267.       GETLIN = OK
  268.       RETURN
  269.    50 CONTINUE
  270.       ALIN(ACOUNT) = TV2
  271.       WHICHS = RIGHT
  272.       ACOUNT = ACOUNT + 1
  273.    60 CONTINUE
  274.       GO TO 20
  275.   100 CONTINUE
  276.       GETLIN = EOF
  277.       RETURN
  278.       END
  279.