Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//
//
// GETSBREC.C - Reads records from the .SBR file and stores the fields
// in the appropriate r_.. buffers.
//
#include "sbrfdef.h"
#include "..\mbrmake\mbrmake.h"
// globals for communicating with clients
BYTE near r_rectyp; // current record type
BYTE near r_majv; // major version num
BYTE near r_minv; // minor version num
BYTE near r_lang; // source language
BYTE near r_fcol; // read column #'s
WORD near r_lineno; // current line number
BYTE near r_column = 0; // def/ref column num
WORD near r_ordinal; // symbol ordinal
WORD near r_attrib; // symbol attribute
char near r_bname[PATH_BUF]; // symbol or filename
char near r_cwd[PATH_BUF]; // .sbr file working directory
int near fhCur; // Current input handle
#pragma intrinsic(memcpy)
#pragma intrinsic(strcpy)
#pragma intrinsic(strlen)
#define MY_BUF_SIZE 16384
static char sbrBuf[MY_BUF_SIZE + 1]; static char *pchBuf; static int cchBuf;
#define GetByte(X) \
{ \ if (!cchBuf) { \ cchBuf = read(fhCur, sbrBuf, MY_BUF_SIZE); \ sbrBuf[cchBuf] = 0; \ pchBuf = sbrBuf; \ \ if (cchBuf == 0) \ SBRCorrupt("premature EOF"); \ } \ \ cchBuf--; \ (X) = (unsigned char)*pchBuf++; \ }
#define GetWord(X) \
{ \ \ GetByte(((char *)&(X))[0]); \ GetByte(((char *)&(X))[1]); \ }
void GetStr(char *buf) // get null terminated string from current .sbr file
//
{ register int l;
for (;;) { // there is always a NULL after the real buffer
l = strlen(pchBuf);
if (l++ < cchBuf) { strcpy(buf, pchBuf); cchBuf -= l; pchBuf += l; return; }
memcpy(buf, pchBuf, cchBuf); buf += cchBuf;
cchBuf = read(fhCur, sbrBuf, MY_BUF_SIZE); sbrBuf[cchBuf] = 0; pchBuf = sbrBuf;
if (cchBuf == 0) SBRCorrupt("premature EOF"); } } BYTE GetSBRRec() // read the next record from the current .sbr file
//
{ static fFoundHeader; BYTE col;
// read rectype, check for EOF as we go
if (!cchBuf) { cchBuf = read(fhCur, sbrBuf, MY_BUF_SIZE); sbrBuf[cchBuf] = 0; pchBuf = sbrBuf;
if (cchBuf == 0) { fFoundHeader = 0; // this is in case we are reinitialized
return S_EOF; } } cchBuf--; r_rectyp = (unsigned char)*pchBuf++;
switch(r_rectyp) { case SBR_REC_HEADER: if (fFoundHeader) SBRCorrupt("Multiple Headers");
fFoundHeader = 1; GetByte(r_majv); GetByte(r_minv); GetByte(r_lang); GetByte(r_fcol);
if (r_majv != 1 || r_minv != 1) break;
GetStr (r_cwd); break;
case SBR_REC_MODULE: GetStr (r_bname); break;
case SBR_REC_LINDEF: GetWord (r_lineno); if (r_lineno) r_lineno--; break;
case SBR_REC_SYMDEF: GetWord (r_attrib); GetWord (r_ordinal); if (r_fcol) GetByte (col); GetStr (r_bname); break;
case SBR_REC_OWNER: GetWord (r_ordinal); break;
case SBR_REC_SYMREFUSE: case SBR_REC_SYMREFSET: GetWord (r_ordinal); if (r_fcol) GetByte (col); break;
case SBR_REC_MACROBEG: case SBR_REC_MACROEND: case SBR_REC_BLKBEG: case SBR_REC_BLKEND: case SBR_REC_MODEND: break; } return (r_rectyp); }
|