This is m_lib.c in view mode; [Download] [Up]
/* * Routines to manipulate the pcomm.modem file */ #include <stdio.h> #include "modem.h" /* * Read the modem/TTY database file. Returns a pointer to a static area * containing the MODEM structure. All modem entries and all TTY entries * are created regardless of the number of physical entries in the file. */ struct MODEM * read_modem(extra) char *extra; { extern char *null_ptr; FILE *fp, *my_fopen(); int i, tty, mod, line, oops, m_line, start, stop; char *str_dup(), buf[200], message[80], token[40], *str_tok(), *str; char *temp_token, *t_sep, *m_sep, *m_letter, *findfile(); static struct MODEM m; void error_win(); if ((m.m_path = findfile(extra, "pcomm.modem")) == NULL) error_win(1, "Support file \"pcomm.modem\" is missing", "or no read permission"); if (!(fp = my_fopen(m.m_path, "r"))) { sprintf(buf, "\"%s\" for read", m.m_path); error_win(1, "Can't open modem/TTY file", buf); } t_sep = ";;\n"; m_sep = ";;;;\n;;;;;;\n;;;\n"; m_letter = "abc"; oops = 0; tty = 0; mod = 0; line = 0; m_line = 0; while (fgets(buf, 200, fp) != NULL) { line++; if (tty >= NUM_TTY || mod >= NUM_MODEM) break; /* get the token */ if (!(temp_token = str_tok(buf, '='))) { sprintf(message, "is missing a token at line %d", line); oops++; break; } if (*temp_token != 'T' && *temp_token != 'M') { sprintf(message, "is corrupted at line %d", line); oops++; break; } /* the TTY database */ if (*temp_token == 'T') { /* * This is similar to the "real" strtok() command * but this one returns a pointer to NULL on a missing * token. Note the use of the field separator * array. */ for (i=0; i<3; i++) { if (!(str = str_tok((char *) NULL, t_sep[i]))) { sprintf(message, "is missing a parameter at line %d", line); oops++; break; } switch (i) { case 0: m.tty[tty] = str_dup(str); break; case 1: m.tname[tty] = str_dup(str); break; case 2: m.init_sp[tty] = atoi(str); break; } } if (oops) break; /* sanity checking */ sprintf(token, "TTY_%d", tty+1); if (strcmp(token, temp_token)) { sprintf(message, "is corrupted at line %d", line); oops++; break; } tty++; continue; } /* the modem database */ else { sprintf(token, "MODEM_%d%c", mod+1, m_letter[m_line]); if (strcmp(token, temp_token)) { sprintf(message, "is corrupted at line %d", line); oops++; break; } /* * There are three lines to the modem database. They * are distinguished by the letters a, b, and, c * appended to the entry number. */ switch (m_line) { case 0: start = 0; stop = 5; break; case 1: start = 5; stop = 12; break; case 2: start = 12; stop = 16; break; } for (i=start; i<stop; i++) { if (!(str = str_tok((char *) NULL, m_sep[i]))) { sprintf(message, "is missing a parameter at line %d", line); oops++; break; } switch (i) { case 0: m.mname[mod] = str_dup(str); break; case 1: m.init[mod] = str_dup(str); break; case 2: m.dial[mod] = str_dup(str); break; case 3: m.suffix[mod] = str_dup(str); break; case 4: m.hang_up[mod] = str_dup(str); break; case 5: m.auto_baud[mod] = *str; break; case 6: m.con_3[mod] = str_dup(str); break; case 7: m.con_12[mod] = str_dup(str); break; case 8: m.con_24[mod] = str_dup(str); break; case 9: m.con_48[mod] = str_dup(str); break; case 10: m.con_96[mod] = str_dup(str); break; case 11: m.con_192[mod] = str_dup(str); break; case 12: m.no_con1[mod] = str_dup(str); break; case 13: m.no_con2[mod] = str_dup(str); break; case 14: m.no_con3[mod] = str_dup(str); break; case 15: m.no_con4[mod] = str_dup(str); break; } } if (oops) break; m_line++; if (m_line >= 3) { m_line = 0; mod++; } } } fclose(fp); if (oops) { sprintf(buf, "Modem/TTY database file \"%s\"", m.m_path); error_win(1, buf, message); } m.t_entries = tty; m.m_entries = mod; m.t_cur = -1; m.m_cur = -1; /* if empty database */ if (!tty) { sprintf(buf, "Modem/TTY database file \"%s\"", m.m_path); error_win(0, buf, "has no TTY data"); } if (!mod) { sprintf(buf, "Modem/TTY database file \"%s\"", m.m_path); error_win(0, buf, "has no modem data"); } /* fill in the rest */ for (; tty<NUM_TTY; tty++) { m.tty[tty] = null_ptr; m.tname[tty] = null_ptr; m.init_sp[tty] = 0; } for (; mod<NUM_MODEM; mod++) { m.mname[mod] = null_ptr; m.init[mod] = null_ptr; m.dial[mod] = null_ptr; m.suffix[mod] = null_ptr; m.hang_up[mod] = null_ptr; m.auto_baud[mod] = 'Y'; m.con_3[mod] = null_ptr; m.con_12[mod] = null_ptr; m.con_24[mod] = null_ptr; m.con_48[mod] = null_ptr; m.con_96[mod] = null_ptr; m.con_192[mod] = null_ptr; m.no_con1[mod] = null_ptr; m.no_con2[mod] = null_ptr; m.no_con3[mod] = null_ptr; m.no_con4[mod] = null_ptr; } return(&m); } /* * Update the modem database. Other routines actually do the changes * or deletions in memory. A non-zero return code means non-fatal error. */ int up_modem() { FILE *fp, *my_fopen(); char buf[80]; int i; void error_win(); /* open for write */ if (!(fp = my_fopen(modem->m_path, "w"))) { sprintf(buf, "\"%s\"", modem->m_path); error_win(0, "No write permission on modem/TTY database file", buf); return(1); } /* put back the TTY entries */ for (i=0; i<modem->t_entries; i++) fprintf(fp, "TTY_%d=%s;%s;%d\n", i+1, modem->tty[i], modem->tname[i], modem->init_sp[i]); /* put back the modem entries */ for (i=0; i<modem->m_entries; i++) { fprintf(fp, "MODEM_%da=%s;%s;%s;%s;%s\n", i+1, modem->mname[i], modem->init[i], modem->dial[i], modem->suffix[i], modem->hang_up[i]); fprintf(fp, "MODEM_%db=%c;%s;%s;%s;%s;%s;%s\n", i+1, modem->auto_baud[i], modem->con_3[i], modem->con_12[i], modem->con_24[i], modem->con_48[i], modem->con_96[i], modem->con_192[i]); fprintf(fp, "MODEM_%dc=%s;%s;%s;%s\n", i+1, modem->no_con1[i], modem->no_con2[i], modem->no_con3[i], modem->no_con4[i]); } fclose(fp); return(0); } /* * See if the new modem is already in the database. If it's not, create * a slot for it and update the modem->m_cur variable. */ void create_modem(str) char *str; { int i; char *str_rep(), buf[80]; void error_win(); /* modem entry already exists? */ for (i=0; i<modem->m_entries; i++) { if (!strcmp(str, modem->mname[i])) return; } /* empty slot available? */ if (modem->m_entries == NUM_MODEM) { sprintf(buf, "\"%s\"", modem->m_path); error_win(0, "No empty modem slots in", buf); return; } /* create a new entry */ i = modem->m_entries; modem->mname[i] = str_rep(modem->mname[i], str); /* update number of entries */ modem->m_entries++; return; } /* * See if the modem names in the list still need to be in the database. * If you find a "lost" entry, delete it and collapse the list. */ void del_modem() { extern char *null_ptr; int i, j, match; char *str_rep(); void free_ptr(); for (i=0; i<modem->m_entries; i++) { match = 0; for (j=0; j<modem->t_entries; j++) { if (!strcmp(modem->mname[i], modem->tname[j])) { match++; break; } } /* found a "lost" modem name */ if (!match) { for (j=i; j<modem->m_entries-1; j++) { /* copy the info */ modem->mname[j] = str_rep(modem->mname[j], modem->mname[j+1]); modem->init[j] = str_rep(modem->init[j], modem->init[j+1]); modem->dial[j] = str_rep(modem->dial[j], modem->dial[j+1]); modem->suffix[j] = str_rep(modem->suffix[j], modem->suffix[j+1]); modem->hang_up[j] = str_rep(modem->hang_up[j], modem->hang_up[j+1]); modem->auto_baud[j] = modem->auto_baud[j+1]; modem->con_3[j] = str_rep(modem->con_3[j], modem->con_3[j+1]); modem->con_12[j] = str_rep(modem->con_12[j], modem->con_12[j+1]); modem->con_24[j] = str_rep(modem->con_24[j], modem->con_24[j+1]); modem->con_48[j] = str_rep(modem->con_48[j], modem->con_48[j+1]); modem->con_96[j] = str_rep(modem->con_96[j], modem->con_96[j+1]); modem->con_192[j] = str_rep(modem->con_192[j], modem->con_192[j+1]); modem->no_con1[j] = str_rep(modem->no_con1[j], modem->no_con1[j+1]); modem->no_con2[j] = str_rep(modem->no_con2[j], modem->no_con2[j+1]); modem->no_con3[j] = str_rep(modem->no_con3[j], modem->no_con3[j+1]); modem->no_con4[j] = str_rep(modem->no_con4[j], modem->no_con4[j+1]); } j = modem->m_entries -1; free_ptr(modem->mname[j]); free_ptr(modem->init[j]); free_ptr(modem->dial[j]); free_ptr(modem->suffix[j]); free_ptr(modem->hang_up[j]); free_ptr(modem->con_3[j]); free_ptr(modem->con_12[j]); free_ptr(modem->con_24[j]); free_ptr(modem->con_48[j]); free_ptr(modem->con_96[j]); free_ptr(modem->con_192[j]); free_ptr(modem->no_con1[j]); free_ptr(modem->no_con2[j]); free_ptr(modem->no_con3[j]); free_ptr(modem->no_con4[j]); /* create an empty entry */ modem->mname[j] = null_ptr; modem->init[j] = null_ptr; modem->dial[j] = null_ptr; modem->suffix[j] = null_ptr; modem->hang_up[j] = null_ptr; modem->auto_baud[j] = 'Y'; modem->con_3[j] = null_ptr; modem->con_12[j] = null_ptr; modem->con_24[j] = null_ptr; modem->con_48[j] = null_ptr; modem->con_96[j] = null_ptr; modem->con_192[j] = null_ptr; modem->no_con1[j] = null_ptr; modem->no_con2[j] = null_ptr; modem->no_con3[j] = null_ptr; modem->no_con4[j] = null_ptr; /* update the counts */ modem->m_entries--; if (modem->m_cur >= modem->m_entries) modem->m_cur = -1; return; } } return; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.