File: edit-bsd.c

package info (click to toggle)
rc 1.7.2-1
  • links: PTS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 1,084 kB
  • ctags: 1,050
  • sloc: ansic: 7,631; sh: 1,123; yacc: 124; makefile: 100; perl: 13
file content (91 lines) | stat: -rw-r--r-- 1,533 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include "rc.h"

#include <stdio.h>

#include <histedit.h>

#include "edit.h"

bool editing = 1;

struct cookie {
	EditLine *el;
	History *hist;
};

static char *prompt;

void *edit_begin(int fd) {
	FILE *f;
	HistEvent he;
	struct cookie *c;

	c = ealloc(sizeof *c);
	if (fd == 0)
		f = stdin;
	else
		f = fdopen(fd, "r");
	c->el = el_init("rc", f, stdout, stderr);
	el_set(c->el, EL_SIGNAL, 0);
	el_source(c->el, NULL);

	c->hist = history_init();
	history(c->hist, &he, H_SETSIZE, 20);
	el_set(c->el, EL_HIST, history, c->hist);

	return c;
}


static void edit_catcher(int sig) {
	write(2, "\n", 1);
	rc_raise(eError);
}

char *edit_alloc(void *cookie, size_t *count) {
	const char *r;
	HistEvent he;
	struct cookie *c = cookie;
	void (*oldint)(int), (*oldquit)(int);

	oldint = sys_signal(SIGINT, edit_catcher);
	oldquit = sys_signal(SIGQUIT, edit_catcher);

	r = el_gets(c->el, count);

	sys_signal(SIGINT, oldint);
	sys_signal(SIGQUIT, oldquit);

	if (r)
		history(c->hist, &he, H_ENTER, r);
	return (char *)r; /* cast to avoid gcc warning */
}

static char *edit_prompter(EditLine *e) {
	return prompt;
}

void edit_prompt(void *cookie, char *pr) {
	struct cookie *c = cookie;

	prompt = pr;
	el_set(c->el, EL_PROMPT, edit_prompter);
}

void edit_free(void *cookie) {
	/* this function deliberately left blank */
}

void edit_end(void *cookie) {
	struct cookie *c = cookie;

	el_end(c->el);
	history_end(c->hist);
	efree(c);
}

void edit_reset(void *cookie) {
	struct cookie *c = cookie;

	el_set(c->el, EL_TERMINAL, NULL);
}