fis-gtm/sr_port/skan_rnum.c

108 lines
2.7 KiB
C
Raw Normal View History

/****************************************************************
* *
* Copyright 2001, 2012 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 "gtm_string.h"
#include "gdsroot.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "gdsblk.h"
#include "copy.h"
#include "util.h"
#include "cli.h"
#include "skan_rnum.h"
#define MAX_UTIL_LEN 80
GBLREF block_id patch_curr_blk;
GBLREF sgmnt_addrs *cs_addrs;
GBLREF char patch_comp_key[MAX_KEY_SZ + 1];
GBLREF unsigned short patch_comp_count;
GBLREF int patch_rec_counter;
sm_uc_ptr_t skan_rnum(sm_uc_ptr_t bp, bool over_run)
{
char util_buff[MAX_UTIL_LEN];
unsigned short cc;
int tmp_cmpc;
sm_uc_ptr_t b_top, rp, r_top, key_top;
short int size, rec_size;
int4 record;
if (((blk_hdr_ptr_t) bp)->bsiz > cs_addrs->hdr->blk_size)
b_top = bp + cs_addrs->hdr->blk_size;
else if (((blk_hdr_ptr_t) bp)->bsiz < SIZEOF(blk_hdr))
b_top = bp + SIZEOF(blk_hdr);
else
b_top = bp + ((blk_hdr_ptr_t) bp)->bsiz;
if (!cli_get_hex("RECORD", (uint4 *)&record))
return 0;
if (record < 1)
{
util_out_print("Error: record less than 1",TRUE);
return 0;
}
patch_rec_counter = 1;
rp = bp + SIZEOF(blk_hdr);
patch_comp_key[0] = patch_comp_key[1] = 0;
patch_comp_count = 0;
for ( ; record > 1 && rp < b_top ;record--)
{
GET_SHORT(rec_size, &((rec_hdr_ptr_t)rp)->rsiz);
if (rec_size < SIZEOF(rec_hdr))
r_top = rp + SIZEOF(rec_hdr);
else
r_top = rp + rec_size;
if (r_top >= b_top)
{
if (!over_run)
break;
r_top = b_top;
}
patch_rec_counter++;
if (((blk_hdr_ptr_t) bp)->levl)
key_top = r_top - SIZEOF(block_id);
else
{
for (key_top = rp + SIZEOF(rec_hdr); key_top < r_top ; )
if (!*key_top++ && !*key_top++)
break;
}
EVAL_CMPC2((rec_hdr_ptr_t)rp, tmp_cmpc);
if (tmp_cmpc > patch_comp_count)
cc = patch_comp_count;
else
cc = tmp_cmpc;
size = key_top - rp - SIZEOF(rec_hdr);
if (size > SIZEOF(patch_comp_key) - 2 - cc)
size = SIZEOF(patch_comp_key) - 2 - cc;
if (size < 0)
size = 0;
memcpy(&patch_comp_key[cc], rp + SIZEOF(rec_hdr), size);
patch_comp_count = cc + size;
rp = r_top;
}
if (record > 1)
{
memcpy(util_buff, "Error: last record in blk is ", 29);
util_buff[ i2hex_nofill(patch_rec_counter, (uchar_ptr_t)&util_buff[29], 8) + 29 ] = 0;
util_out_print(&util_buff[0],TRUE);
return 0;
}
return rp;
}