2 * Copyright (c) 1992, 1993
3 * The Regents of the University of California. All rights reserved.
5 * %sccs.include.redist.c%
9 static char sccsid
[] = "$Id: v_init.c,v 8.18 1994/01/09 16:47:16 bostic Exp $ (Berkeley) $Date: 1994/01/09 16:47:16 $";
12 #include <sys/types.h>
22 static int v_comment
__P((SCR
*, EXF
*));
29 v_screen_copy(orig
, sp
)
32 VI_PRIVATE
*ovip
, *nvip
;
34 /* Create the private vi structure. */
35 CALLOC_RET(orig
, nvip
, VI_PRIVATE
*, 1, sizeof(VI_PRIVATE
));
36 sp
->vi_private
= nvip
;
39 nvip
->inc_lastch
= '+';
40 nvip
->inc_lastval
= 1;
44 /* User can replay the last input, but nothing else. */
45 if (ovip
->rep_len
!= 0) {
46 MALLOC(orig
, nvip
->rep
, char *, ovip
->rep_len
);
47 if (nvip
->rep
!= NULL
) {
48 memmove(nvip
->rep
, ovip
->rep
, ovip
->rep_len
);
49 nvip
->rep_len
= ovip
->rep_len
;
53 nvip
->inc_lastch
= ovip
->inc_lastch
;
54 nvip
->inc_lastval
= ovip
->inc_lastval
;
56 if (ovip
->paragraph
!= NULL
&&
57 (nvip
->paragraph
= strdup(ovip
->paragraph
)) == NULL
) {
58 msgq(sp
, M_SYSERR
, NULL
);
78 FREE(vip
->rep
, vip
->rep_len
);
80 if (vip
->paragraph
!= NULL
)
81 FREE(vip
->paragraph
, vip
->paragraph_len
);
83 /* Free private memory. */
84 FREE(vip
, sizeof(VI_PRIVATE
));
85 sp
->vi_private
= NULL
;
102 * The default address is line 1, column 0. If the address set
103 * bit is on for this file, load the address, ensuring that it
106 if (F_ISSET(sp
->frp
, FR_CURSORSET
)) {
107 sp
->lno
= sp
->frp
->lno
;
108 sp
->cno
= sp
->frp
->cno
;
110 if (file_gline(sp
, ep
, sp
->lno
, &len
) == NULL
) {
111 if (sp
->lno
!= 1 || sp
->cno
!= 0) {
112 if (file_lline(sp
, ep
, &sp
->lno
))
118 } else if (sp
->cno
>= len
)
125 if (O_ISSET(sp
, O_COMMENT
) && v_comment(sp
, ep
))
129 /* Reset strange attraction. */
133 /* Make ex display to a special function. */
134 if ((sp
->stdfp
= fwopen(sp
, sp
->s_ex_write
)) == NULL
) {
135 msgq(sp
, M_SYSERR
, "ex output");
138 #ifdef MAKE_EX_OUTPUT_LINE_BUFFERED
139 (void)setvbuf(sp
->stdfp
, NULL
, _IOLBF
, 0);
142 /* Display the status line. */
143 return (status(sp
, ep
, sp
->lno
, 0));
154 /* Close down ex output file descriptor. */
155 (void)fclose(sp
->stdfp
);
162 * Handle change of options for vi.
172 return (v_buildparagraph(sp
));
179 * Skip the first comment.
191 (p
= file_gline(sp
, ep
, lno
, &len
)) != NULL
&& len
== 0; ++lno
);
192 if (p
== NULL
|| len
<= 1 || memcmp(p
, "/*", 2))
195 for (; len
; --len
, ++p
)
196 if (p
[0] == '*' && len
> 1 && p
[1] == '/') {
200 } while ((p
= file_gline(sp
, ep
, ++lno
, &len
)) != NULL
);