zOs/REXX.O08/SCANREAD

/* copy scanRead begin ************************************************/

scanReadIni: procedure expose m.
    if m.scanRead.ini = 1 then
        return
    m.scanRead.ini = 1 then
    call scanIni
    call jIni
    call oDecMethods oNewClass('ScanRead'),
        , 'scanReadNl return scanReadNlImpl(m, unCond)',
        , 'scanSpaceNl scanReadSpaceNl(m)',
        , 'scanClose call scanReadClose m ',
        , 'scanInfo scanReadInfo(m)',
        , 'scanPos  scanReadPos(m)'
    return
endProcedure scanReadIni

/*--- begin scanning the lines of a reader ---------------------------*/
scanRead: procedure expose m.
parse arg rdr, n1, np, co
    return scanReadReset(oNew('ScanRead'), rdr , n1, np, co)

scanReadReset: procedure expose m.
parse arg m, rdr, n1, np, co
    call scanReset m, n1, np, co
    m.m.atEnd = 0
    m.m.lineX = 0
    m.m.read = rdr
    call jOpen rdr, 'r'
    call scanReadNl m, 1
    return m
endProcedure scanRead

scanClose: procedure expose m.
parse arg m
    interpret oObjMethod(m, 'scanClose')
    return

scanReadClose: procedure expose m.
parse arg m
    call jClose m.m.read
    return

scanReadNl: procedure expose m.
parse arg m, unCond
    interpret oObjMethod(m, 'scanReadNl')
endProcedure scanReadNl
/*--- return true/false whether we are at the end of line / reader ---*/
scanReadNLimpl: procedure expose m.
parse arg m, unCond
    if unCond ^== 1 then
        if m.m.pos <= length(m.m.src) then
            return 0
    if m.m.atEnd then
        return 0
    m.m.atEnd = ^ jRead(m.m.read, m'.SRC')
    if m.m.atEnd then do
        m.m.pos = 1 + length(m.m.src)
        end
    else do
        m.m.pos = 1
        m.m.lineX = m.m.lineX + 1
        end
    return ^ m.m.atEnd
endProcedure scanReadNLimpl

scanReadSpaceNl: procedure expose m.
parse arg m
    fnd = 0
    do forever
        if scanSpaceCom(m) then
            fnd = 1
        if ^ scanReadNl(m) then
             return fnd
        fnd = 1
        end
endProcedure scanReadSpaceNl

scanReadPos: procedure expose m.
parse arg m, msg
    if scanAtEnd(m) then
        return E
    else
        return m.m.lineX m.m.pos
endProcedure scanReadPos

scanReadInfo: procedure expose m.
parse arg m, msg
    if scanAtEnd(m) then
        msg = msg'\natEnd after'
    else
        msg = msg'\npos' m.m.pos 'in'
    return msg 'line' m.m.lineX':' strip(m.m.src, 't')
endProcedure scanReadInfo
/* copy scanRead end **************************************************/