📄 dial.c
字号:
default: werror(_("Unknown dialing directory version")); dendd = 1; dialents = mkstdent(); return -1; } if (size % dial_ver.size != 0) { werror(_("Phonelist garbled (?)")); fclose(fp); dendd = 1; dialents = mkstdent(); return -1; } /* Read in the dialing entries */ nrents = size / dial_ver.size; if (nrents == 0) { dialents = mkstdent(); nrents = 1; fclose(fp); return 0; } for(f = 1; f <= nrents; f++) { if ((d = malloc(sizeof (struct dialent))) == NULL) { if (f == 1) dialents = mkstdent(); else tail->next = NULL; werror(_("Out of memory while reading dialing directory")); fclose(fp); return -1; } switch (dial_ver.version) { case 0: v0_read(fp, d); break; case 1: v1_read(fp, d); break; case 2: v2_read(fp, d); break; case 3: v3_read(fp, d); break; case 4: v4_read(fp, d, &dial_ver); break; case 5: v5_read(fp, d); break; } /* MINIX terminal type is obsolete */ if (d->term == 2) d->term = 1; if (tail) tail->next = d; else dialents = d; tail = d; } d->next = NULL; fclose(fp); if (dial_ver.size < sizeof(struct dialent)) { if (snprintf(copycmd,sizeof(copycmd), "cp %s %s.%hd",dfile,dfile,dial_ver.size) > 0) { if (P_LOGFNAME[0] != 0) do_log("%s", copycmd); if (system(copycmd) == 0) { snprintf(copycmd,sizeof(copycmd), _("Old dialdir copied as %s.%hd"),dfile,dial_ver.size); w = mc_tell("%s", copycmd); if (w) { sleep(2); mc_wclose(w,1); } writedialdir(); } } } return 0;}/* * Write the new $HOME/.dialdir */static void writedialdir(void){ struct dialent *d; char dfile[256]; FILE *fp; struct dver dial_ver; char oldfl; int omask; /* Make no sense if access denied */ if (dendd) return; snprintf(dfile, sizeof(dfile), "%s/.dialdir", homedir); omask = umask(077); if ((fp = sfopen(dfile, "w")) == NULL) { umask(omask); werror(_("Cannot open ~/.dialdir for writing!")); dendd = 1; return; } umask(omask); d = dialents; /* Set up version info. */ dial_ver.magic = DIALMAGIC; dial_ver.version = 5; dial_ver.size = htons(sizeof(struct dialent)); dial_ver.res1 = 0; /* We don't use these res? fields, but let's */ dial_ver.res2 = 0; /* initialize them to a known init value for */ dial_ver.res3 = 0; /* whoever needs them later / jl 22.09.97 */ dial_ver.res4 = 0; if (fwrite(&dial_ver, sizeof(dial_ver), 1, fp) != 1) { werror(_("Error writing to ~/.dialdir!")); fclose(fp); return; } /* Write dialing directory */ while (d) { struct dialent dent_n; oldfl = d->flags; d->flags &= FL_SAVE; convert_to_save_order(&dent_n, d); if (fwrite(&dent_n, sizeof(dent_n), 1, fp) != 1) { werror(_("Error writing to ~/.dialdir!")); fclose(fp); return; } d->flags = oldfl; d = d->next; } fclose(fp);}/* * Get entry "no" in list. */static struct dialent *getno(int no){ struct dialent *d; d = dialents; if (no < 0 || no >= nrents) return (struct dialent *)NULL; while (no--) d = d->next; return d;}/* Note: Minix does not exist anymore. */static const char *te[] = { "VT102", "MINIX", "ANSI " };/* * Display a "dedit" entry * We need to make sure that the previous value * gets fully overwritten in all languages (i.e. arbitrary strings)! */static void dedit_toggle_entry(WIN *w, int x, int y, int toggle, char *toggle_true, char *toggle_false){ int lt = mbslen(toggle_true); int lf = mbslen(toggle_false); int l = ((lt > lf) ? lt : lf) + 1; char *buf, *s = toggle ? toggle_true : toggle_false; int i; if (!(buf = alloca(l))) return; strncpy(buf, s, l); for (i = mbslen(s); i < l - 1; i++) buf[i] = ' '; buf[l - 1] = 0; mc_wlocate(w, x, y); mc_wputs(w, buf);}/* * Edit an entry. */static void dedit(struct dialent *d){ WIN *w; int c; char *name = _(" A - Name :"), *number = _(" B - Number :"), *dial_string = _(" C - Dial string # :"), *local_echo = _(" D - Local echo :"), *script = _(" E - Script :"), *username = _(" F - Username :"), *password = _(" G - Password :"), *terminal_emulation = _(" H - Terminal Emulation :"), *backspace_key_sends = _(" I - Backspace key sends :"), *linewrap = _(" J - Linewrap :"), *line_settings = _(" K - Line Settings :"), *conversion_table = _(" L - Conversion table :"), *question = _("Change which setting?"); w = mc_wopen(5, 4, 75, 19, BDOUBLE, stdattr, mfcolor, mbcolor, 0, 0, 1); mc_wprintf(w, "%s %s\n", name, d->name); mc_wprintf(w, "%s %s\n", number, d->number); mc_wprintf(w, "%s %d\n", dial_string, d->dialtype + 1); mc_wprintf(w, "%s %s\n", local_echo, _(yesno(d->flags & FL_ECHO))); mc_wprintf(w, "%s %s\n", script, d->script); mc_wprintf(w, "%s %s\n", username, d->username); mc_wprintf(w, "%s %s\n", password, d->password); mc_wprintf(w, "%s %s\n", terminal_emulation, te[d->term - 1]); mc_wprintf(w, "%s %s\n", backspace_key_sends, d->flags & FL_DEL ? _("Delete") : _("Backspace")); mc_wprintf(w, "%s %s\n", linewrap, d->flags & FL_WRAP ? _("On") : _("Off")); mc_wprintf(w, "%s %s %s%s%s\n", line_settings, d->baud, d->bits, d->parity, d->stopb); mc_wprintf(w, "%s %s\n", conversion_table, d->convfile); mc_wprintf(w, _(" Last dialed : %s %s\n"),d->lastdate,d->lasttime); mc_wprintf(w, _(" Times on : %d"),d->count); mc_wlocate(w, 4, 15); mc_wputs(w, question); mc_wredraw(w, 1); while (1) { mc_wlocate(w, mbslen (question) + 5, 15); c = wxgetch(); if (c >= 'a') c -= 32; switch(c) { case '\033': case '\r': case '\n': mc_wclose(w, 1); return; case 'A': mc_wlocate(w, mbslen (name) + 1, 0); mc_wgets(w, d->name, 31, 32); break; case 'B': mc_wlocate(w, mbslen (number) + 1, 1); mc_wgets(w, d->number, 31, 32); break; case 'C': d->dialtype = (d->dialtype + 1) % 3; mc_wlocate(w, mbslen (dial_string) + 1, 2); mc_wprintf(w, "%d", d->dialtype + 1); mc_wflush(); break; case 'D': d->flags ^= FL_ECHO; mc_wlocate(w, mbslen (local_echo) + 1, 3); mc_wprintf(w, "%s", _(yesno(d->flags & FL_ECHO))); mc_wflush(); break; case 'E': mc_wlocate(w, mbslen (script) + 1, 4); mc_wgets(w, d->script, 31, 32); break; case 'F': mc_wlocate(w, mbslen (username) + 1, 5); mc_wgets(w, d->username, 31, 32); break; case 'G': mc_wlocate(w, mbslen (password) + 1, 6); mc_wgets(w, d->password, 31, 32); break; case 'H': d->term = (d->term % 3) + 1; /* MINIX == 2 is obsolete. */ if (d->term == 2) d->term = 3; mc_wlocate(w, mbslen (terminal_emulation) + 1, 7); mc_wputs(w, te[d->term - 1]); /* Also set backspace key. */ if (d->term == ANSI) { d->flags &= ~FL_DEL; d->flags |= FL_WRAP; } else { d->flags |= FL_DEL; d->flags &= ~FL_WRAP; } dedit_toggle_entry(w, mbslen(backspace_key_sends) + 1, 8, d->flags & FL_DEL, _("Delete"), _("Backspace")); dedit_toggle_entry(w, mbslen(linewrap) + 1, 9, d->flags & FL_WRAP, _("On"), _("Off")); break; case 'I': d->flags ^= FL_DEL; dedit_toggle_entry(w, mbslen(backspace_key_sends) + 1, 8, d->flags & FL_DEL, _("Delete"), _("Backspace")); break; case 'J': d->flags ^= FL_WRAP; dedit_toggle_entry(w, mbslen(linewrap) + 1, 9, d->flags & FL_WRAP, _("On"), _("Off")); break; case 'K': get_bbp(d->baud, d->bits, d->parity, d->stopb, 1); mc_wlocate(w, mbslen (line_settings) + 1, 10); mc_wprintf(w, "%s %s%s%s ", d->baud, d->bits, d->parity, d->stopb); break; case 'L': /* jl 21.09.97 */ mc_wlocate(w, mbslen (conversion_table) + 1, 11); mc_wgets(w, d->convfile, 15, 16); break; default: break; } }}static WIN *dsub;static const char *const what[] = { /* TRANSLATORS: Translation of each of these menu items should not be * longer than 7 characters. The upper-case letter is a shortcut, * so keep them unique and ASCII; 'h', 'j', 'k', 'l' are reserved */ N_("Dial"), N_("Find"), N_("Add"), N_("Edit"), N_("Remove"), N_("moVe"), N_("Manual") };/* Offsets of what[] entries from position_dialing_directory */#define DIALOPTS (sizeof(what) / sizeof(*what))#define DIAL_WIDTH 8 /* Width of one entry */static size_t what_lens[DIALOPTS]; /* Number of bytes for <= 7 characters *//* Number of ' ' padding entries at left and right, left is >= 1 */static int what_padding[DIALOPTS][2];static int dprev;/* Draw an entry in the horizontal menu */static void horiz_draw(size_t k){ static const char spaces[] = " "; mc_wprintf(dsub, "%.*s", what_padding[k][0], spaces); mc_wprintf(dsub, "%.*s", what_lens[k], _(what[k])); mc_wprintf(dsub, "%.*s", what_padding[k][1], spaces);}/* * Highlight a choice in the horizontal menu. */static void dhili(int position_dialing_directory, int k){ if (k == dprev) return; if (dprev >= 0) { mc_wlocate(dsub, position_dialing_directory + DIAL_WIDTH * dprev, 0); if (!useattr) { mc_wputs(dsub, " "); } else { mc_wsetattr(dsub, XA_REVERSE | stdattr); horiz_draw(dprev); } } dprev = k; mc_wlocate(dsub, position_dialing_directory + DIAL_WIDTH * k, 0); if (!useattr) { mc_wputs(dsub, ">"); } else { mc_wsetattr(dsub, stdattr); horiz_draw(k); }}static const char *fmt = "\r %2d %c%-16.16s%-16.16s%8.8s %5.5s %4d %-15.15s\n";/* * Print the dialing directory. Only draw from "cur" to bottom. */static void prdir(WIN *dialw, int top, int cur){ int f, start; struct dialent *d; start = cur - top; dirflush = 0; mc_wlocate(dialw, 0, start + 1); for (f = start; f < dialw->ys - 2; f++) { d = getno(f + top); if (d == (struct dialent *)0) break; mc_wprintf(dialw, fmt, f+1+top, (d->flags & FL_TAG) ? '>' : ' ', d->name, d->number, d->lastdate, d->lasttime, d->count, d->script); } dirflush = 1; mc_wflush();}/* * Move an entry forward/back in the dial directory. jl 1.9.1999 */int move_entry(WIN *dialw, struct dialent *d, int cur, int *top){ int ocur = cur, quit = 0, c = 0; struct dialent *dtmp; while (!quit) { switch (c = wxgetch()) { case K_DN: case 'j': if (!(d->next)) break; if (cur == 0) { /* special case: move d from start to 2nd */ dtmp = d->next; d->next = dtmp->next; dtmp->next = d; dialents = dtmp; } else { /* swap d with the next one in the list */ dtmp = getno(cur - 1); dtmp->next = d->next; d->next = d->next->next; dtmp->next->next = d; } cur++; break; case K_UP: case 'k': if (cur == 0) break; if (cur == 1) { /* special case: move d to start of list */ dtmp = dialents; dtmp->next = d-> next; d->next = dtmp; dialents = d; } else { /* swap d with the previous one in the list */ dtmp = getno(cur - 2); dtmp->next->next = d-> next; d->next = dtmp->next; dtmp->next = d; } cur--; break; case '\033': case '\r': case '\n': quit = 1; break; default: break; } /* end switch */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -