fis-gtm/sr_port/iomt_rdone.c

102 lines
2.1 KiB
C

/****************************************************************
* *
* Copyright 2001, 2006 Fidelity Information Services, Inc *
* *
* This source code contains the intellectual property *
* of its copyright holder(s), and is made available *
* under a license. If you do not know the terms of *
* the license, please stop and do not read further. *
* *
****************************************************************/
#include "mdef.h"
#include "io.h"
#include "iottdef.h"
#include "iomtdef.h"
#include "iosp.h"
GBLREF io_pair io_curr_device;
int iomt_rdone(mint *v, int4 t)
{
error_def(ERR_MTRDTHENWRT);
unsigned char x;
io_desc *dv;
d_mt_struct *mt_ptr;
dv = io_curr_device.in;
mt_ptr = (d_mt_struct *)dv->dev_sp;
#ifdef UNIX
if (mt_ptr->mode != MT_M_READ)
{
uint4 status;
status = iomt_reopen(dv, MT_M_READ, FALSE);
if (status != SS_NORMAL)
rts_error(VARLSTCNT (1) status);
}
#endif
switch (mt_ptr->last_op)
{
case mt_rewind:
if (mt_ptr->labeled == MTLAB_DOS11)
iomt_rddoslab(dv);
else if (mt_ptr->labeled == MTLAB_ANSI)
iomt_rdansistart (dv);
/* CAUTION: FALL THROUGH */
case mt_null:
if (iomt_readblk(dv))
{
if (!mt_ptr->stream)
iomt_getrec(dv);
}
break;
case mt_read:
break;
default:
rts_error(VARLSTCNT (1) ERR_MTRDTHENWRT);
}
if (io_curr_device.in->dollar.zeof)
{
*v = -1;
return TRUE;
}
if (mt_ptr->stream)
{
if (mt_ptr->buffptr >= mt_ptr->bufftop)
{
iomt_readblk (dv);
if (io_curr_device.in->dollar.zeof)
{
*v = -1;
return TRUE;
}
}
iomt_rdstream(1, &x, dv);
if (io_curr_device.in->dollar.zeof)
*v = -1;
else if (mt_ptr->rec.len == 0)
{
*v = 11;
io_curr_device.in->dollar.x = 0;
io_curr_device.in->dollar.y++;
} else
*v = (unsigned int)x;
} else
{
if (mt_ptr->rec.len == 0)
{
*v = 13;
io_curr_device.in->dollar.x = 0;
io_curr_device.in->dollar.y++;
mt_ptr->last_op = mt_null;
return TRUE;
}
*v = (unsigned int)(*mt_ptr->rec.addr++);
mt_ptr->rec.len--;
}
mt_ptr->last_op = mt_read;
return TRUE;
}