--disable-* were not respected
[nvi.git] / common / gs.c
blob6bc6adf390196d5744c54365794ed0b841846046
1 /*-
2 * Copyright (c) 2000
3 * Sven Verdoolaege. All rights reserved.
5 * See the LICENSE file for redistribution information.
6 */
8 #include "config.h"
10 #include <sys/types.h>
11 #include <sys/queue.h>
13 #include <bitstring.h>
14 #include <ctype.h>
15 #include <errno.h>
16 #include <stdio.h>
17 #include <stdlib.h>
18 #include <string.h>
19 #include <unistd.h>
21 #include "../common/common.h"
22 #include "../perl_api/extern.h"
24 static void perr __P((char *, char *));
27 * gs_init --
28 * Create and partially initialize the GS structure.
29 * PUBLIC: GS * gs_init __P((char*));
31 GS *
32 gs_init(char *name)
34 GS *gp;
35 char *p;
37 /* Figure out what our name is. */
38 if ((p = strrchr(name, '/')) != NULL)
39 name = p + 1;
41 /* Allocate the global structure. */
42 CALLOC_NOMSG(NULL, gp, GS *, 1, sizeof(GS));
43 if (gp == NULL)
44 perr(name, NULL);
46 gp->progname = name;
48 /* Common global structure initialization. */
49 /* others will need to be copied from main.c */
50 CIRCLEQ_INIT(&gp->dq);
52 CIRCLEQ_INIT(&gp->hq);
53 gp->noprint = DEFAULT_NOPRINT;
55 /* Structures shared by screens so stored in the GS structure. */
56 CIRCLEQ_INIT(&gp->frefq);
57 CIRCLEQ_INIT(&gp->exfq);
58 LIST_INIT(&gp->seqq);
60 thread_init(gp);
62 return (gp);
66 * gs_new_win
67 * Create new window
68 * PUBLIC: WIN * gs_new_win __P((GS *gp));
71 WIN *
72 gs_new_win(GS *gp)
74 WIN *wp;
76 CALLOC_NOMSG(NULL, wp, WIN *, 1, sizeof(*wp));
77 if (!wp)
78 return NULL;
80 /* Common global structure initialization. */
81 LIST_INIT(&wp->ecq);
82 LIST_INSERT_HEAD(&wp->ecq, &wp->excmd, q);
84 CIRCLEQ_INSERT_TAIL(&gp->dq, wp, q);
85 CIRCLEQ_INIT(&wp->scrq);
87 CIRCLEQ_INIT(&wp->dcb_store.textq);
88 LIST_INIT(&wp->cutq);
90 wp->gp = gp;
92 return wp;
96 * win_end --
97 * Remove window.
99 * PUBLIC: int win_end __P((WIN *wp));
102 win_end(WIN *wp)
104 SCR *sp;
106 CIRCLEQ_REMOVE(&wp->gp->dq, wp, q);
108 if (wp->ccl_sp != NULL) {
109 (void)file_end(wp->ccl_sp, NULL, 1);
110 (void)screen_end(wp->ccl_sp);
112 while ((sp = wp->scrq.cqh_first) != (void *)&wp->scrq)
113 (void)screen_end(sp);
115 /* Free key input queue. */
116 if (wp->i_event != NULL)
117 free(wp->i_event);
119 /* Free cut buffers. */
120 cut_close(wp);
122 /* Free default buffer storage. */
123 (void)text_lfree(&wp->dcb_store.textq);
125 #if defined(DEBUG) || defined(PURIFY) || defined(LIBRARY)
126 /* Free any temporary space. */
127 if (wp->tmp_bp != NULL)
128 free(wp->tmp_bp);
129 #endif
131 return 0;
135 * gs_end --
136 * End the program, discarding screens and most of the global area.
138 * PUBLIC: void gs_end __P((GS *));
140 void
141 gs_end(GS *gp)
143 MSGS *mp;
144 SCR *sp;
145 WIN *wp;
147 /* If there are any remaining screens, kill them off. */
148 while ((wp = gp->dq.cqh_first) != (void *)&gp->dq)
149 (void)win_end(wp);
150 while ((sp = gp->hq.cqh_first) != (void *)&gp->hq)
151 (void)screen_end(sp);
153 #ifdef HAVE_PERL_INTERP
154 perl_end(gp);
155 #endif
157 #if defined(DEBUG) || defined(PURIFY) || defined(LIBRARY)
158 { FREF *frp;
159 /* Free FREF's. */
160 while ((frp = gp->frefq.cqh_first) != (FREF *)&gp->frefq) {
161 CIRCLEQ_REMOVE(&gp->frefq, frp, q);
162 if (frp->name != NULL)
163 free(frp->name);
164 if (frp->tname != NULL)
165 free(frp->tname);
166 free(frp);
170 /* Free map sequences. */
171 seq_close(gp);
173 /* Close message catalogs. */
174 msg_close(gp);
175 #endif
177 /* Ring the bell if scheduled. */
178 if (F_ISSET(gp, G_BELLSCHED))
179 (void)fprintf(stderr, "\07"); /* \a */
182 * Flush any remaining messages. If a message is here, it's almost
183 * certainly the message about the event that killed us (although
184 * it's possible that the user is sourcing a file that exits from the
185 * editor).
187 while ((mp = gp->msgq.lh_first) != NULL) {
188 (void)fprintf(stderr, "%s%.*s",
189 mp->mtype == M_ERR ? "ex/vi: " : "", (int)mp->len, mp->buf);
190 LIST_REMOVE(mp, q);
191 #if defined(DEBUG) || defined(PURIFY) || defined(LIBRARY)
192 free(mp->buf);
193 free(mp);
194 #endif
197 #if defined(TRACE)
198 /* Close tracing file descriptor. */
199 vtrace_end();
200 #endif
205 * perr --
206 * Print system error.
208 static void
209 perr(char *name, char *msg)
211 (void)fprintf(stderr, "%s:", name);
212 if (msg != NULL)
213 (void)fprintf(stderr, "%s:", msg);
214 (void)fprintf(stderr, "%s\n", strerror(errno));
215 exit(1);