⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dgops.cpp

📁 CBASE v1.01 采用Borland公司TC++编写的数据库管理源程序库
💻 CPP
字号:
/*	Copyright (c) 1989 Citadel	*/
/*	   All Rights Reserved    	*/

/* #ident	"@(#)dgops.c	1.4 - 90/06/20" */

#include <blkio.h>
#include <ctype.h>
#include <errno.h>
#include <stdio.h>
/*#include <string.h>*/

/* local headers */
#include "btree_.h"

static void printkey(FILE *fp, const char *buf, size_t n);

/*man---------------------------------------------------------------------------
NAME
     bt_dgbtp - btree diagnostics for control structure

SYNOPSIS
     #include "btree_.h"

     void bt_dgbtp(btp, fp)
     btree_t *btp;
     FILE *fp;

DESCRIPTION
     The bt_dgbtp function writes the contents of btree control
     structure btp in a printable format to file fp.

SEE ALSO
     bt_dgbtree, bt_dgnode, bt_dgtuple.

PORTABILITY WARNING
     bt_dgbtp assumes that size_t is unsigned int.

------------------------------------------------------------------------------*/
void bt_dgbtp(btree_t *btp, FILE *fp)
{
	fputs("------------------------------------\n", fp);
	fputs("| btree control structure contents |\n", fp);
	fputs("|----------------------------------|\n", fp);
	if (!bt_valid(btp)) {
		fprintf(fp, "|  btp          = %p.\n", btp);
		fputs("|  Invalid btree pointer           |\n", fp);
		fputs("------------------------------------\n", fp);
		return;
	}
	fprintf(fp, "|  hdr.flh      = %lu.\n", btp->bthdr.flh);
	fprintf(fp, "|  hdr.m        = %d.\n", btp->bthdr.m);
	fprintf(fp, "|  hdr.keysize  = %u.\n", btp->bthdr.keysize);
	fprintf(fp, "|  hdr.flags    = %Xh.\n", btp->bthdr.flags);
	fprintf(fp, "|  hdr.root     = %lu.\n", btp->bthdr.root);
	fprintf(fp, "|  hdr.first    = %lu.\n", btp->bthdr.first);
	fprintf(fp, "|  hdr.last     = %lu.\n", btp->bthdr.last);
	fprintf(fp, "|  hdr.keycnt   = %lu.\n", btp->bthdr.keycnt);
	fprintf(fp, "|  hdr.height   = %lu.\n", btp->bthdr.height);
	fprintf(fp, "|  bp           = %p.\n", btp->bp);
	fprintf(fp, "|  flags        = %Xh.\n", btp->flags);
	fprintf(fp, "|  fldc         = %d.\n", btp->fldc);
	fprintf(fp, "|  fldv         = %p.\n", btp->fldv);
	fprintf(fp, "|  cbtpos.node  = %lu.\n", btp->cbtpos.node);
	fprintf(fp, "|  cbtpos.key   = %d.\n", btp->cbtpos.key);
	fprintf(fp, "|  cbtnp        = %p.\n", btp->cbtnp);
	fprintf(fp, "|  sp           = %p.\n", btp->sp);
	fputs("------------------------------------\n", fp);

	return;
}

/*man---------------------------------------------------------------------------
NAME
     bt_dgbtree - btree diagnostics for tree

SYNOPSIS
     #include "btree_.h"

     int bt_dgbtree(btp, node, fp)
     btree_t *btp;
     bpos_t node;
     FILE *fp;

DESCRIPTION
     The bt_dgbtree command dumps the contents of btree file to the
     text file associated with FILE pointer fp.  The contents of each
     node is written, starting with node node and descending in a
     preorder traversal of the tree.

SEE ALSO
     bt_dgbtp, bt_dgnode, bt_dgtuple.

EXAMPLE
     The following call will display the contents of an entire tree on
     the screen.

          bt_dgbtree(btp, btp->bthdr.root, stdout);

------------------------------------------------------------------------------*/
int bt_dgbtree(btree_t *btp, bpos_t node, FILE *fp)
{
	btnode_t *btnp = NULL;
	int i = 0;

	/* check for bottom of tree */
	if (node == NIL) {
		errno = 0;
		return 0;
	}

	/* read node and display */
	btnp = bt_ndalloc(btp);
	if (btnp == NULL) {
		BTEPRINT;
		return -1;
	}
	if (bt_ndget(btp, node, btnp) == -1) {
		BTEPRINT;
		bt_ndfree(btnp);
		return -1;
	}
	fprintf(fp, "Node block:  %lu.\n", node);
	bt_dgnode(btp, btnp, fp);
	fputc('\n', fp);

	/* recurse rest of tree */
	for (i = 0; i < btp->bthdr.m; ++i) {
		if (bt_dgbtree(btp, *bt_kychildp(btnp, i), fp) == -1) {
			return -1;
		}
	}

	bt_ndfree(btnp);
	btnp = NULL;

	errno = 0;
	return 0;
}

/*man---------------------------------------------------------------------------
NAME
     bt_dgnode - btree diagnostics for node

SYNOPSIS
     #include "btree_.h"

     void bt_dgnode(btp, btnp, fp)
     btree_t *btp;
     btnode_t *btnp;
     FILE *fp;

DESCRIPTION
     The bt_dgnode function writes the contents of node btnp of btree
     btp in a printable format to file fp.

SEE ALSO
     bt_dgbtp, bt_dgbtree, bt_dgtuple.

------------------------------------------------------------------------------*/
void bt_dgnode(btree_t *btp, btnode_t *btnp, FILE *fp)
{
	int i = 0;

	fputs("--------------------------\n", fp);
	fputs("| btree node contents    |\n", fp);
	fputs("--------------------------\n", fp);
	if (!bt_valid(btp)) {
		fprintf(fp, "|  btp          = %p.\n", btp);
		fputs("|  Invalid btree pointer |\n", fp);
		fputs("--------------------------\n", fp);
		return;
	}
	if (btnp == NULL) {
		fputs("|  btnp         = NULL   |\n", fp);
		fputs("--------------------------\n", fp);
		return;
	}
	if (btnp->lsib == NIL) {
		fprintf(fp, "|  lsib         = NIL\n");
	} else {
		fprintf(fp, "|  lsib         = %lu\n", btnp->lsib);
	}
	if (btnp->rsib == NIL) {
		fprintf(fp, "|  rsib         = NIL\n");
	} else {
		fprintf(fp, "|  rsib         = %lu\n", btnp->rsib);
	}
	fprintf(fp, "|  n            = %d\n", btnp->n);
	fprintf(fp, "|  keyv         = %p\n", btnp->keyv);
	fprintf(fp, "|  childv       = %p\n", btnp->childv);
	if (btnp->keyv == NULL || btnp->childv == NULL) {
		fputs("--------------------------\n", fp);
		return;
	}
	if (*bt_kychildp(btnp, 0) == NIL) {
		fputs("|  child[0] = NIL\n", fp);
	} else {
		fprintf(fp, "|  child[0] = %lu\n", *bt_kychildp(btnp, 0));
	}
	for (i = 1; (i <= btp->bthdr.m); ++i) {
		fprintf(fp, "|  key[%d] = \"", i);
		printkey(fp, (char *)bt_kykeyp(btp, btnp, i), btkeysize(btp));
		fputs("\"\n", fp);
		if (*bt_kychildp(btnp, i) == NIL) {
			fprintf(fp, "|  child[%d] = NIL\n", i);
		} else {
			fprintf(fp, "|  child[%d] = %lu\n", i, *bt_kychildp(btnp, i));
		}
	}
	fputs("--------------------------\n", fp);

	return;
}

/*man---------------------------------------------------------------------------
NAME
     bt_dgtuple - btree diagnostics for tuple

SYNOPSIS
     #include "btree_.h"

     void bt_dgtuple(btp, bttplp, fp)
     btree_t *btp;
     bttpl_t *bttplp;
     FILE *fp;

DESCRIPTION
     The bt_dgtuple function writes the contents of tuple bttplp of
     btree btp in a printable format to file fp.

SEE ALSO
     bt_dgbtp, bt_dgbtree, bt_dgnode.

------------------------------------------------------------------------------*/
void bt_dgtuple(btree_t *btp, bttpl_t *bttplp, FILE *fp)
{
	fputs("--------------------------\n", fp);
	fputs("|btree bttpl contents   |\n", fp);
	fputs("|------------------------|\n", fp);
	if (!bt_valid(btp)) {
		fprintf(fp, "|  btp          = %p.\n", btp);
		fputs("|  Invalid btree pointer |\n", fp);
		fputs("--------------------------\n", fp);
		return;
	}
	if (bttplp == NULL) {
		fputs("|  bttplp       = NULL   |\n", fp);
		fputs("--------------------------\n", fp);
		return;
	}
	if (bttplp->keyp == NULL) {
		fputs("|  bttplp->keyp = NULL   |\n", fp);
		fputs("--------------------------\n", fp);
		return;
	}
	fputs("|  key          = \"", fp);
	printkey(fp, (char *)bttplp->keyp, btkeysize(btp));
	fputs("\"\n", fp);
	if (bttplp->child == NIL) {
		fputs("|  child        = NIL    |\n", fp);
	} else {
		fprintf(fp, "|  child        = %lu.\n", bttplp->child);
	}
	fputs("--------------------------\n", fp);

	return;
}

static void printkey(FILE *fp, const char *buf, size_t n)
{
	int i = 0;
	int c = 0;

	for (i = 0; i < n; ++i) {
		c = buf[i];
		switch (c) {
		case '\a':	/* BEL */
			fprintf(fp, "\\a");
			break;
		case '\b':	/* BS */
			fprintf(fp, "\\b");
			break;
		case '\f':	/* FF */
			fprintf(fp, "\\f");
			break;
		case '\n':	/* NL */
			fprintf(fp, "\\n");
			break;
		case '\r':	/* CR */
			fprintf(fp, "\\r");
			break;
		case '\t':	/* HT */
			fprintf(fp, "\\t");
			break;
		case '\v':	/* VT */
			fprintf(fp, "\\v");
			break;
		case '\\':
			fprintf(fp, "\\\\");
			break;
		case '\"':
			fprintf(fp, "\\\"");
			break;
		default:
			if (isprint(c)) {
				fputc(c, fp);
			} else {
				fprintf(fp, "\\%.3o", c);
			}
			break;
		}
	}

	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -