ftp.nice.ch/pub/next/unix/communication/pcomm.NIHS.bs.tar.gz#/pcomm/Source/d_revise.c

This is d_revise.c in view mode; [Download] [Up]

/*
 * The revise option of the dialing directory.  A non-zero return code
 * means that something was updated.  Prompts for saving changes to disk.
 */

#include <stdio.h>
#include <curses.h>
#include "config.h"
#include "dial_dir.h"
#include "misc.h"
#include "param.h"

int
revise()
{
	WINDOW *r_win, *newwin();
	int count, dir_flag, param_flag, num, x, y, save;
	char ans, buf[40], *ld, *str_rep();
	static char *ld_prompt();

	r_win = newwin(7, 77, 7, 2);

	mvwaddstr(r_win, 3, 6, "Entry to revise?");
	mvwaddstr(r_win, 3, 35, "(Entry Number, +, -, @, #)");
	box(r_win, VERT, HORZ);
	wmove(r_win, 3, 23);
	wrefresh(r_win);

	dir_flag = 0;
	param_flag = 0;
	count = 0;

	/*
	 * Can't use my home-grown get_str() and get_num() functions
	 * here, because we are prompting for an entry number or a
	 * long distance code.  This routine echoes numbers only.
	 */
	while ((ans = wgetch(r_win)) != ESC) {
		if (ans >= '0' && ans <= '9') {
			if (count == 3) {
				beep();
				continue;
			}
			buf[count] = ans;
			waddch(r_win, (chtype) ans);
			wrefresh(r_win);
			count++;
			continue;
		}
					/* terminating CR */
		if (ans == '\r') {
			if (!count) {
				beep();
				continue;
			}
			buf[count] = '\0';
			num = atoi(buf);
					/* valid range of numbers? */
			if (num == 0 || num > NUM_DIR) {
				beep();
				mvwaddstr(r_win, 3, 23, "   ");
				wmove(r_win, 3, 23);
				wrefresh(r_win);
				count = 0;
				continue;
			}
					/* prompt for that entry */
			if (prompt_lib(r_win, num)) {
				dir_flag++;
				break;
			}
			delwin(r_win);
			return(0);
		}
					/* do our own backspace */
		if (ans == BS || ans == DEL) {
			if (!count) {
				beep();
				continue;
			}
			count--;
			buf[count] = '\0';
			getyx(r_win, y, x);
			x--;
			wmove(r_win, y, x);
			waddch(r_win, (chtype) ' ');
			wmove(r_win, y, x);
			wrefresh(r_win);
			continue;
		}
					/* non-number after number is error */
		if (count) {
			beep();
			continue;
		}
					/* prompt for LD codes */
		switch (ans) {
			case '+':
				if ((ld = ld_prompt(r_win, param->ld_plus, ans)) != NULL) {
					param->ld_plus = str_rep(param->ld_plus, ld);
					param_flag++;
				}
				break;
			case '-':
				if ((ld = ld_prompt(r_win, param->ld_minus, ans)) != NULL) {
					param->ld_minus = str_rep(param->ld_minus, ld);
					param_flag++;
				}
				break;
			case '@':
				if ((ld = ld_prompt(r_win, param->ld_at, ans)) != NULL) {
					param->ld_at = str_rep(param->ld_at, ld);
					param_flag++;
				}
				break;
			case '#':
				if ((ld = ld_prompt(r_win, param->ld_pound, ans)) != NULL) {
					param->ld_pound = str_rep(param->ld_pound, ld);
					param_flag++;
				}
				break;
			default:
				beep();
				continue;
		}
		break;
	}
					/* if nothing changed */
	if (!param_flag && !dir_flag) {
		delwin(r_win);
		return(0);
	}
					/* save to disk? */
	clear_line(r_win, 4, 4, TRUE);
	if (dir_flag) {
		sprintf(buf, "Save entry %d to disk", num);
		save = yes_prompt(r_win, 4, 4, A_BOLD, buf);
	}
	else
		save = yes_prompt(r_win, 4, 4, A_BOLD, "Save to disk");

					/* update the files */
	if (save && dir_flag) {
		if (up_dir(num)) {
			touchwin(r_win);
			wrefresh(r_win);
		}
	}
	if (save && param_flag) {
		if (up_param()) {
			touchwin(r_win);
			wrefresh(r_win);
		}
	}
	delwin(r_win);
	return(1);
}

/*
 * Prompt for long distance code changes.  If new string is a space,
 * change it to null_ptr.  Returns NULL on escape.  Since it uses
 * get_str(), the return value is a pointer to a static area.
 */

static char *
ld_prompt(win, current_ld, name)
WINDOW *win;
char *current_ld, name;
{
	extern char *null_ptr;
	char *ans, *get_str();

	werase(win);
	mvwprintw(win, 2, 4, "%-20.20s", current_ld);
	mvwprintw(win, 4, 4, "New LD code for %c: ", name);
	box(win, VERT, HORZ);
	wrefresh(win);

	if ((ans = get_str(win, 20, "", "\n")) == NULL)
		return(NULL);
					/* if space, change to null_ptr */
	if (!strcmp(ans, " "))
		ans = null_ptr;
					/* display new value */
	clear_line(win, 2, 4, TRUE);
	wattrstr(win, A_BOLD, ans);

	return(ans);
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.