This is e_lib.c in view mode; [Download] [Up]
/*
* Routines to manipulate the pcomm.extrnl file
*/
#include <stdio.h>
#include "extrnl.h"
/*
* Read the external file transfer program database. Returns a pointer
* to a static area containing the EXTRNL structure. This support file is
* optional.
*/
struct EXTRNL *
read_extrnl(extra)
char *extra;
{
extern char *null_ptr;
FILE *fp, *my_fopen();
int i, line, up, entry, oops;
char *str_dup(), buf[200], message[80], token[40], *str_tok(), *str;
char *sep, *temp_token, *findfile();
static struct EXTRNL e;
void error_win();
if ((e.e_path = findfile(extra, "pcomm.extrnl")) == NULL) {
/* not required to exist */
for (i=0; i<3; i++) {
e.name[0][i] = null_ptr;
e.command[0][i] = null_ptr;
e.prompt[0][i] = 'N';
e.name[1][i] = null_ptr;
e.command[1][i] = null_ptr;
e.prompt[1][i] = 'N';
}
e.up_entries = 0;
e.dn_entries = 0;
return(&e);
}
if (!(fp = my_fopen(e.e_path, "r"))) {
sprintf(buf, "\"%s\" for read", e.e_path);
error_win(1, "Can't open external program file", buf);
}
sep = ";;\n";
line = 0;
up = 1;
oops = 0;
while (fgets(buf, 200, fp) != NULL) {
line++;
if (line <= 3)
entry = line-1;
else {
up = 0;
entry = line-4;
}
/* get the token */
if (!(temp_token = str_tok(buf, '='))) {
sprintf(message, "is missing a token at line %d", line);
oops++;
break;
}
/*
* Parse the rest of the line. This is similar to using
* the "real" strtok() function, but this version returns
* a pointer to NULL if the token is missing. Note the
* use of the array of separators.
*/
for (i=0; i<3; i++) {
if (!(str = str_tok((char *) NULL, sep[i]))) {
sprintf(message, "is missing a parameter at line %d", line);
oops++;
break;
}
switch(i) {
case 0:
e.name[up][entry] = str_dup(str);
break;
case 1:
e.command[up][entry] = str_dup(str);
break;
case 2:
e.prompt[up][entry] = *str;
break;
}
}
if (oops)
break;
/* sanity checking */
if (up)
sprintf(token, "SEND_%d", entry+1);
else
sprintf(token, "RCV_%d", entry+1);
if (strcmp(temp_token, token)) {
sprintf(message, "is corrupted at line %d", line);
oops++;
break;
}
}
fclose(fp);
if (oops) {
sprintf(buf, "External program file \"%s\"", e.e_path);
error_win(1, buf, message);
}
/* find number of upload entries */
for (i=0; i<3; i++) {
if (e.name[1][i] == null_ptr)
break;
}
e.up_entries = i;
/* find number of download entries */
for (i=0; i<3; i++) {
if (e.name[0][i] == null_ptr)
break;
}
e.dn_entries = i;
/* if empty database */
if (!e.up_entries || !e.dn_entries) {
sprintf(buf, "External program file \"%s\"", e.e_path);
error_win(0, buf, "has no data");
}
return(&e);
}
/*
* Update the external file transfer program database. A non-zero return
* code means a non-fatal error.
*/
int
up_extrnl()
{
FILE *fp, *my_fopen();
int i, up, entry;
char buf[200];
void error_win();
/*
* I don't remember why I made this file optional. For the next
* release, it will be mandatory! The following is kludge to tell
* the user that there is no file to save anything to.
*/
if (extrnl->e_path == NULL) {
error_win(0, "No \"pcomm.extrnl\" file in use", "");
return(1);
}
/* open for write */
if (!(fp = my_fopen(extrnl->e_path, "w"))) {
sprintf(buf, "\"%s\"", extrnl->e_path);
error_win(0, "No write permission on external program file", buf);
return(1);
}
/* put 'em back */
up = 1;
for (i=0; i<6; i++) {
if (i < 3)
entry = i;
else {
up = 0;
entry = i-3;
}
if (up)
fprintf(fp, "SEND_%d=%s;%s;%c\n", entry+1, extrnl->name[up][entry], extrnl->command[up][entry], extrnl->prompt[up][entry]);
else
fprintf(fp, "RCV_%d=%s;%s;%c\n", entry+1, extrnl->name[up][entry], extrnl->command[up][entry], extrnl->prompt[up][entry]);
}
fclose(fp);
return(0);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.