www.pudn.com > slow.zip > dial.C
/********************************************************* ********************************************************** dial.c ********************************************************** **********************************************************/ /* Modem for MIPS AJF January 1995 Dialling routines */ #include#include #include #include "modem.h" #define MAXSTRLEN 256 static void collapse(char*, char*, char*), senddtmf(char*); global void dialnumber(char *telno) { char vec[MAXSTRLEN+1]; strcpy(vec, &telno[1]); if (telno[0] == '+') { collapse(vec, "", "00"); collapse(vec, "0044", "0"); collapse(vec, "01904", ""); collapse(vec, "", "791"); /* route via B.T. */ if (vec[3] >= '2' && vec[3] <= '4') collapse(vec, "79143", ""); /* internal extension */ } waitfortone(DIAL_TONE); infomsg("Dialling %s", vec); senddtmf(vec); } static void collapse(char *ovec, char *s1, char *s2) { int n1 = strlen(s1), n2 = strlen(s2); if (strncmp(ovec, s1, n1) == 0) { char nvec[MAXSTRLEN+1]; strcpy(nvec, s2); strcpy(&nvec[n2], &ovec[n1]); strcpy(ovec, nvec); } } static float rowtab[4] = { 697.0, 770.0, 852.0, 941.0 }; static float coltab[4] = { 1209.0, 1336.0, 1477.0, 1633.0 }; static void senddtmf(char *s) { int k = 0; until (s[k] == '\0') { char *dstr = "123A456B789C*0#D"; char *p = strchr(dstr, s[k++]); unless (p == NULL) { int n = p - dstr; sendfreqs(rowtab[n >> 2], coltab[n & 3], 0.1); /* tones for 100 ms */ sendpause(0.1); /* silence for 100 ms */ } } }