This is xcdial.c in view mode; [Download] [Up]
/* xcdial.c -- dialing directory module for XC This file uses 4-character tabstops Author: Steve Manes 8/26/88 */ #include <stdio.h> #include <string.h> #include <ctype.h> #include <sys/types.h> //#include <termio.h> #include <curses.h> #include <fcntl.h> #include "xc.h" #define NAME 26 /* display for system name */ #define NUMBER 22 /* " " phone number */ #define BPS 5 /* " " speed */ #define PROTO 2 /* " " protocol */ #define SCRIPT 14 /* " " script name */ static FILE *dirf; static long pages[57]; /* offsets into phonefile */ static short dirnum, thispage, lastpage; static char *last_nbr = NIL(char); static char format[46]; extern short s_flag; extern void cl_end(), newbmask(); struct { char *speed; } speed[] = { "300", "600", "1200", "2400", "4800", "9600", #ifdef B19200 "19200", #endif #ifdef B38400 "38400", "57600", #endif NIL(char) }; struct { char *proto; } proto[] = { "8N", "7E", "7O", NIL(char) }; /* show a single, formatted dialdir entry. check its format integrity as we go */ static void showentry(choice, entry) short choice; char *entry; { char name[NAME +1], num[NUMBER +1], bps[BPS +1], prot[PROTO+1], script[SCRIPT +1]; char *s; int i, j; s = entry; while (isspace(*s)) s++; for (i=0; i < NUMBER && !isspace(*s); i++, s++) num[i] = *s; num[i]='\0'; while (!isspace(*s)) s++; while (isspace(*s)) s++; for (i=0; i < NAME && *s != '\t' && *s != '\n'; i++, s++) name[i] = *s; name[i] = '\0'; memset(bps,0,BPS+1); if (s = strstr(entry, "BPS=")){ s += 4; for (i=0; i < BPS && isdigit(*s); i++, s++) bps[i] = *s; for (i = 0, j = 0 ; speed[i].speed ; i++) if (!strcmp(bps,speed[i].speed)) j++; if (!j){ beep(); sprintf(Msg,"Invalid BPS= for '%s'",name); S; return; } } strcpy(prot, protocol); if (s = strstr(entry, "PROTO=")){ s += 6; for (i=0; i < PROTO && isalnum(*s); i++, s++) prot[i] = *s; prot[i]='\0'; uc_word(prot); for (i=0, j=0; proto[i].proto; i++) if (!strcmp(prot,proto[i].proto)) j++; if (!j){ beep(); sprintf(Msg,"Invalid PROT= for '%s'",name); S; return; } } memset(script,0, SCRIPT+1); if (s = strstr(entry, "SCRIPT=")){ s += 7; for (i=0; i < SCRIPT && !isspace(*s); i++, s++) script[i] = *s; } fprintf(tfp, format, choice, name, num, script, bps, prot); } /* scroll directory at current filepos */ static void scroll_dir() { short i; char buf[120]; mode(OLDMODE); ttgoto(4, 0); cur_off(); cl_end(); fseek(dirf, pages[thispage], 0), dirnum = thispage * (LI - 6); for (i=0; i < LI - 6; i++){ if (!fgets(buf, 120, dirf)){ lastpage = thispage; break; } showentry(++dirnum, buf); } pages[thispage + 1] = ftell(dirf); if (!fgets(buf, 120, dirf)) lastpage = thispage; cur_on(); mode(NEWMODE); } /* Dial a phone number, using proper format and delay. */ void xcdial(s) char *s; { char buffer[SM_BUFF]; if (last_nbr) free(last_nbr); last_nbr = strdup(s); sprintf(buffer, DIALSTR, s); send_string(buffer); } static parse_entry(buf) char *buf; { int i; char *s, *t, *nbr, bps[BPS+1], prot[PROTO+1]; if (s = strchr(buf,'\n')) *s = '\0'; if (s = strstr(buf, "BPS=")){ s += 4; for (i=0; i < BPS && isdigit(*s); i++, s++) bps[i] = *s; bps[i]='\0'; if (!mrate(bps)){ S0("Invalid BPS="); return FAILURE; } } if (s = strstr(buf, "PROTO=")){ s += 6; for (i=0; i < PROTO && isalnum(*s); i++, s++) prot[i] = *s; prot[i]='\0'; uc_word(prot); if (!xc_setproto(prot)){ S0("Invalid PROTO="); return FAILURE; } } cls(); sprintf(Msg,"Calling %s",buf); S; if (s = strstr(buf, "PREFIX=")) s += 7, send_string("\r"), send_string(s), send_string("\r"), s -= 7, *s = '\0', sleep(1); while (isspace(*buf) && *buf) buf++; if (!(*buf)) return FAILURE; for (nbr = buf; !isspace(*buf) && *buf; buf++) ; *buf = '\0'; xcdial(nbr); if (s = strstr(++buf, "SCRIPT=")){ s += 7; t = s; while (*t && !isspace(*t)) t++; *t = '\0'; sprintf(ddsname,"%s",s); s_flag = linkflag = TRUE; } return SUCCESS; } static dial_entry(choice) short choice; { char buf[120]; if (!choice) return FAILURE; rewind(dirf); while (choice--){ if (!fgets(buf, 120, dirf)){ S0("Nonexistent entry"); return FAILURE; } } return (parse_entry(buf)); } static man_dial() { ttgoto(LI-1, 0); cl_end(); fputs("Number to dial: ",tfp); getline(); if (!line[0]) return FAILURE; return (parse_entry(line)); } dial_dir() { int i, c; char buf[5]; if (!(dirf = openfile(phonefile))){ sprintf(Msg,"Phonelist '%s' not found",phonefile); S; return FAILURE; } dirnum = thispage = 0; lastpage = -1; cls(); drawline(0, 0, 80); ttgoto(1,(CO-strlen(phonefile))/2 -1); show(-1,phonefile); drawline(2, 0, 80); ttgoto(3, 0); sprintf(format," %%-%ds %%%ds %%-%ds %%%ds %%%ds%*s\n\r", NAME, NUMBER, SCRIPT, BPS, PROTO, 80-NAME-NUMBER-BPS-PROTO-SCRIPT-7, ""); sprintf(Msg, format, "NAME", "NUMBER", "SCRIPT", "BPS", "PRO"); show(-1,Msg); sprintf(format,"%%3d - %%-%ds %%%ds %%-%ds %%%ds %%%ds\n\r", NAME, NUMBER, SCRIPT, BPS, PROTO); scroll_dir(); for (;;){ ttgoto(LI-1, 0); fputs( "==> [#] Dial Entry [M]anual Dial [X]it [N]ext [P]revious", tfp); ttgoto(LI-1, 4); while (1){ c = toupper(fgetc(stdin)); if (c == BS) continue; if (c == 'N' || c == '\n' || c == ' '){ if (thispage > (int)((1000/(LI-6))-1) || thispage == lastpage) S0("Last page"); else thispage++, scroll_dir(); break; } else if (c == 'P' && dirnum > 1){ if (!thispage) S0("First page"); else thispage--, scroll_dir(); break; } else if (c == 'X'){ cls(); fclose(dirf); return FAILURE; } else if (c == 'M'){ if (man_dial()){ fclose(dirf); reterm = TRUE; return SUCCESS; } reterm = FALSE; break; } else if (isdigit(c)){ buf[0] = c; fputc(c,tfp); for (i=1; i<4; ++i){ buf[i] = getchar(); if (buf[i]==BS){ if (i>0) fputs("\b \b",tfp), i -= 2; else i = -1; continue; } fputc(buf[i],tfp); if (buf[i]=='\n' || buf[i]=='\r') break; } if (!i){ reterm = FALSE; break; } buf[++i] = '\0'; if (dial_entry(atoi(buf))){ fclose(dirf); reterm = TRUE; return SUCCESS; } reterm = FALSE; break; } } } } redial() { char *s; if (!last_nbr){ S1("REDIAL FAILURE"); return -1; } s = strdup(last_nbr); xcdial(s); free(s); return SUCCESS; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.