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

📄 rolodeck.cpp

📁 CBASE v1.01 采用Borland公司TC++编写的数据库管理源程序库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			if (found == 0) {
				puts("There is no current card.\n");
				if (rdlock(cbp, CB_UNLCK) == -1) {
					fprintf(stderr, "*** Error %d unlocking rolodeck.\n", errno);
					bexit(EXIT_FAILURE);
				}
				continue;
			}
			/* delete record */
			if (cbdelcur(cbp) == -1) {
				fprintf(stderr, "*** Error %d deleting current card.\n", errno);
				bexit(EXIT_FAILURE);
			}
			lfmtofml(buf, rd.rd_contact, sizeof(buf));
			printf("%s deleted from rolodeck.\n\n", buf);
			/* new current record */
			switch (sf) {
			default:
				sf = RD_CONTACT;
			case RD_CONTACT:
				found = cbkeysrch(cbp, RD_CONTACT, rd.rd_contact);
				if (found == -1) {
					fprintf(stderr, "*** Error %d searching for key.\n", errno);
					bexit(EXIT_FAILURE);
				}
				break;
			case RD_COMPANY:
				found = cbkeysrch(cbp, RD_COMPANY, rd.rd_company);
				if (found == -1) {
					fprintf(stderr, "*** Error %d searching for key.\n", errno);
					bexit(EXIT_FAILURE);
				}
				break;
			}
			/* load rd with new current card */
			if (cbrcursor(cbp) == NULL) {
				memset(&rd, 0, sizeof(rd));
			} else {
				if (cbgetr(cbp, &rd) == -1) {
					fprintf(stderr, "*** Error %d reading card.\n", errno);
					bexit(EXIT_FAILURE);
				}
			}
			if (rdlock(cbp, CB_UNLCK) == -1) {
				fprintf(stderr, "*** Error %d unlocking rolodeck.\n", errno);
				bexit(EXIT_FAILURE);
			}
			break;	/* case RD_REQ_DEL_CARD: */
		case RD_REQ_SRCH_CARD:	/* search for card */
			if (sf == RD_CONTACT) {
				fputs("Enter contact name:  ", stdout);
			} else {
				fputs("Enter company name:  ", stdout);
			}
			if (fgets(buf, sizeof(buf), stdin) == NULL) {
				fprintf(stderr, "*** Error %d reading input.\n");
				bexit(EXIT_FAILURE);
			}
			cvtss(buf, buf, CVT_XLEADSP | CVT_XTRAILSP | CVT_1SP | CVT_XCTL, sizeof(buf));
			if (sf == RD_CONTACT) {
				fmltolfm(buf, buf, sizeof(buf));
			}
			/* don't lock until after user input */
			if (rdlock(cbp, CB_RDLCK) == -1) {
				fprintf(stderr, "*** Error %d read locking rolodeck.\n", errno);
				bexit(EXIT_FAILURE);
			}
			if (cbreccnt(cbp) == 0) {
				puts("The rolodeck is empty.\n");
				if (rdlock(cbp, CB_UNLCK) == -1) {
					fprintf(stderr, "*** Error %d unlocking rolodeck.\n", errno);
					bexit(EXIT_FAILURE);
				}
				continue;
			}
			found = cbkeysrch(cbp, sf, buf);
			if (found == -1) {
				fprintf(stderr, "*** Error %d searching for key.\n", errno);
				bexit(EXIT_FAILURE);
			}
			if (found == 0) {
				printf("%s not found.\n\n", buf);
				if (cbrcursor(cbp) == NULL) {
					if (cbkeylast(cbp, sf) == -1) {
						fprintf(stderr, "*** Error %d finding last card.\n", errno);
						bexit(EXIT_FAILURE);
					}
				}
			}
			if (cbgetr(cbp, &rd) == -1) {
				fprintf(stderr, "*** Error %d reading card.\n", errno);
				bexit(EXIT_FAILURE);
			}
			if (rdlock(cbp, CB_UNLCK) == -1) {
				fprintf(stderr, "*** Error %d unlocking rolodeck.\n", errno);
				bexit(EXIT_FAILURE);
			}
			putcard(&rd);
			break;	/* case RD_REQ_SRCH_CARD: */
		case RD_REQ_TOG_SORT:	/* toggle sort field */
			switch (sf) {
			case RD_CONTACT:
				sf = RD_COMPANY;
				break;
			case RD_COMPANY:
				sf = RD_CONTACT;
				break;
			default:
				sf = RD_CONTACT;
				break;
			}
			putmenu(sf);
			break;	/* case RD_REQ_TOG_SORT: */
		case RD_REQ_CUR_CARD:	/* display current card */
			if (strlen(rd.rd_contact) == 0) {
				puts("There is no current card.\n");
				continue;
			}
			if (rdlock(cbp, CB_RDLCK) == -1) {
				fprintf(stderr, "*** Error %d read locking rolodeck.\n", errno);
				bexit(EXIT_FAILURE);
			}
			/* use unique key field to set record cursor */
			found = cbkeysrch(cbp, RD_CONTACT, rd.rd_contact);
			if (found == -1) {
				fprintf(stderr, "*** Error %d searching for key.\n", errno);
				bexit(EXIT_FAILURE);
			}
			/* check if card deleted by other process */
			if (found == 0) {
				puts("There is no current card.\n");
			} else {
				if (cbgetr(cbp, &rd) == -1) {
					fprintf(stderr, "*** Error %d reading card.\n", errno);
					bexit(EXIT_FAILURE);
				}
				putcard(&rd);
			}
			if (rdlock(cbp, CB_UNLCK) == -1) {
				fprintf(stderr, "*** Error %d unlocking rolodeck.\n", errno);
				bexit(EXIT_FAILURE);
			}
			break;	/* case RD_REQ_CUR_CARD: */
		case RD_REQ_ALL_CARDS:	/* display all cards */
			if (rdlock(cbp, CB_RDLCK) == -1) {
				fprintf(stderr, "*** Error %d read locking rolodeck.\n", errno);
				bexit(EXIT_FAILURE);
			}
			if (cbreccnt(cbp) == 0) {
				puts("The rolodeck is empty.\n");
				if (rdlock(cbp, CB_UNLCK) == -1) {
					fprintf(stderr, "*** Error %d unlocking rolodeck.\n", errno);
					bexit(EXIT_FAILURE);
				}
				continue;
			}
			if (cbkeyfirst(cbp, sf) == -1) {
				fprintf(stderr, "*** Error %d setting key cursor.\n", errno);
				bexit(EXIT_FAILURE);
			}
			while (cbkcursor(cbp, sf) != NULL) {
				if (cbgetr(cbp, &rd) == -1) {
					fprintf(stderr, "*** Error %d reading card.\n", errno);
					bexit(EXIT_FAILURE);
				}
				putcard(&rd);
				if (cbkeynext(cbp, sf) == -1) {
					fprintf(stderr, "*** Error %d finding next card.\n", errno);
					bexit(EXIT_FAILURE);
				}
			}
			if (rdlock(cbp, CB_UNLCK) == -1) {
				fprintf(stderr, "*** Error %d unlocking rolodeck.\n", errno);
				bexit(EXIT_FAILURE);
			}
			break;	/* case RD_REQ_ALL_CARDS: */
		case RD_REQ_IMPORT:	/* import cards */
			if (rdlock(cbp, CB_WRLCK) == -1) {
				fprintf(stderr, "*** Error %d write locking rolodeck.\n", errno);
				bexit(EXIT_FAILURE);
			}
			printf("Importing cards from %s....\n", EXPFILE);
			if (cbimport(cbp, EXPFILE) == -1) {
				if (errno == ENOENT) {
					puts("Text file not found.\n");
				} else if (errno == CBEDUP) {
					puts("WARNING:  Duplicate card(s) in text file not imported.\n");
				} else {
					fprintf(stderr, "*** Error %d importing rolodeck from %s.\n", errno, EXPFILE);
					bexit(EXIT_FAILURE);
				}
			} else {
				puts("Import complete.\n");
			}
			if (rdlock(cbp, CB_UNLCK) == -1) {
				fprintf(stderr, "*** Error %d unlocking rolodeck.\n", errno);
				bexit(EXIT_FAILURE);
			}
			break;	/* cbase RD_REQ_IMPORT: */
		case RD_REQ_EXPORT:	/* export cards */
			if (rdlock(cbp, CB_RDLCK) == -1) {
				fprintf(stderr, "*** Error %d read locking rolodeck.\n", errno);
				bexit(EXIT_FAILURE);
			}
			printf("Exporting cards to %s....\n", EXPFILE);
			if (cbexport(cbp, EXPFILE) == -1) {
				fprintf(stderr, "*** Error %d exporting rolodeck to %s.\n", errno, EXPFILE);
				bexit(EXIT_FAILURE);
			}
			puts("Export complete.\n");
			if (rdlock(cbp, CB_UNLCK) == -1) {
				fprintf(stderr, "*** Error %d unlocking rolodeck.\n", errno);
				bexit(EXIT_FAILURE);
			}
			break;	/* cbase RD_REQ_EXPORT: */
		case RD_REQ_HELP:	/* help */
			putmenu(sf);
			continue;
			break;	/* case RD_REQ_HELP: */
		default:
			putchar('\a');	/* beep */
			continue;
			break;	/* default: */
		}
	}

	/* close cbase */
	if (cbclose(cbp) == -1) {
		fprintf(stderr, "*** Error %d closing rolodeck.\n", errno);
		bexit(EXIT_FAILURE);
	}

	exit(EXIT_SUCCESS);
}

/* rdlock:  lock rolodeck */
int rdlock(cbase_t *cbp, int ltype)
{
	int i = 0;

	for (i = 0; i < LMAXTRIES; i++) {
		if (cblock(cbp, ltype) == -1) {
			if (errno == EAGAIN) {
				continue;
			}
			return -1;
		} else {
			errno = 0;
			return 0;
		}
	}

	errno = EAGAIN;
	return -1;
}

/* putmenu:  display menu */
int putmenu(int sf)
{
	puts("-----------------------MENU-----------------------");
	puts("| N - Next card          P - Previous card       |");
	puts("| F - First card         L - Last card           |");
	puts("| I - Insert new card    D - Delete current card |");
	puts("| S - Search for card    T - Toggle sort field   |");
	puts("| C - display Current    A - display All cards   |");
	puts("| M - iMport cards       X - eXport cards        |");
	puts("| H - Help (menu)        Q - Quit                |");
	puts("--------------------------------------------------");
	fputs("current sort field:  ", stdout);
	switch (sf) {
	default:
		sf = RD_CONTACT;
	case RD_CONTACT:
		fputs("contact", stdout);
		break;
	case RD_COMPANY:
		fputs("company", stdout);
		break;
	}
	puts(".\n");

	return 0;
}

/* getcard:  input card */
int getcard(rolodeck_t *rdp)
{
	char buf[256];
	int i = 0;

	memset(rdp, 0, sizeof(*rdp));

	printf("Contact:  ");
	fgets(buf, sizeof(buf), stdin);
	cvtss(buf, buf, CVT_XLEADSP | CVT_XTRAILSP | CVT_1SP | CVT_XCTL, sizeof(buf));
	fmltolfm(rdp->rd_contact, buf, sizeof(rdp->rd_contact));
	printf("Title:  ");
	fgets(buf, sizeof(buf), stdin);
	cvtss(rdp->rd_title, buf, CVT_XLEADSP | CVT_XTRAILSP | CVT_1SP | CVT_XCTL, sizeof(rdp->rd_title));
	printf("Company:  ");
	fgets(buf, sizeof(buf), stdin);
	cvtss(rdp->rd_company, buf, CVT_XLEADSP | CVT_XTRAILSP | CVT_1SP | CVT_XCTL, sizeof(rdp->rd_company));
	puts("Street Address (2 lines):");
	for (i = 0; i < 2; i++) {
		fgets(buf, sizeof(buf), stdin);
		cvtss(buf, buf, CVT_XLEADSP | CVT_XTRAILSP | CVT_1SP | CVT_XCTL, sizeof(buf));
		sprintf(rdp->rd_addr + 40 * i, "%-40.40s", buf);
	}
	printf("City:  ");
	fgets(buf, sizeof(buf), stdin);
	cvtss(rdp->rd_city, buf, CVT_XLEADSP | CVT_XTRAILSP | CVT_1SP | CVT_XCTL, sizeof(rdp->rd_city));
	printf("State:  ");
	fgets(buf, sizeof(buf), stdin);
	cvtss(rdp->rd_state, buf, CVT_XSP | CVT_XCTL, sizeof(rdp->rd_state));
	printf("Zip Code:  ");
	fgets(buf, sizeof(buf), stdin);
	cvtss(rdp->rd_zip, buf, CVT_XSP | CVT_XCTL, sizeof(rdp->rd_zip));
	printf("Phone:  ");
	fgets(buf, sizeof(buf), stdin);
	cvtss(rdp->rd_phone, buf, CVT_XSP | CVT_XCTL, sizeof(rdp->rd_phone));
	printf("Extension:  ");
	fgets(buf, sizeof(buf), stdin);
	cvtss(rdp->rd_ext, buf, CVT_XSP | CVT_XCTL, sizeof(rdp->rd_ext));
	printf("Fax:  ");
	fgets(buf, sizeof(buf), stdin);
	cvtss(rdp->rd_fax, buf, CVT_XSP | CVT_XCTL, sizeof(rdp->rd_fax));
	puts("Notes (4 lines):");
	for (i = 0; i < 4; i++) {
		fgets(buf, sizeof(buf), stdin);
		cvtss(buf, buf, CVT_XCTL, sizeof(buf));
		sprintf(rdp->rd_notes + 40 * i, "%-40.40s", buf);
	}

	return 0;
}

/* putcard:  display card */
int putcard(const rolodeck_t *rdp)
{
	char name[sizeof(rdp->rd_contact)];

	lfmtofml(name, rdp->rd_contact, sizeof(name));
	puts("--------------------CARD--------------------");
	printf("| %-40.40s |\n", name);
	printf("| %-40.40s |\n", rdp->rd_title);
	printf("| %-40.40s |\n", rdp->rd_company);
	printf("| %-40.40s |\n", rdp->rd_addr);
	printf("| %-40.40s |\n", rdp->rd_addr + 40);
	printf("| %-25.25s, %-2.2s %-10.10s |\n", rdp->rd_city, rdp->rd_state, rdp->rd_zip);
	printf("| %-12.12s x%-4.4s  fax %-12.12s     |\n", rdp->rd_phone, rdp->rd_ext, rdp->rd_fax);
	printf("| %-40.40s |\n", rdp->rd_notes);
	printf("| %-40.40s |\n", rdp->rd_notes + 40);
	printf("| %-40.40s |\n", rdp->rd_notes + 80);
	printf("| %-40.40s |\n", rdp->rd_notes + 120);
	puts("--------------------------------------------");

	return 0;
}

⌨️ 快捷键说明

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