📄 rolodeck.cpp
字号:
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 + -