annotate src/unexencap.c @ 844:047d37eb70d7

[xemacs-hg @ 2002-05-16 13:30:23 by ben] ui fixes for things that were bothering me bytecode.c, editfns.c, lisp.h, lread.c: Fix save-restriction to use markers rather than pseudo-markers (integers representing the amount of text on either side of the region). That way, all inserts are handled correctly, not just those inside old restriction. Add buffer argument to save_restriction_save(). process.c: Clean up very dirty and kludgy code that outputs into a buffer -- use proper unwind protects, etc. font-lock.c: Do save-restriction/widen around the function -- otherwise, incorrect results will ensue when a buffer has been narrowed before a call to e.g. `buffer-syntactic-context' -- something that happens quite often. fileio.c: Look for a handler for make-temp-name. window.c, winslots.h: Try to solve this annoying problem: have two frames displaying the buffer, in different places; in one, temporarily switch away to another buffer and then back -- and you've lost your position; it's reset to the other one in the other frame. My current solution involves window-level caches of buffers and points (also a cache for window-start); when set-window-buffer is called, it looks to see if the buffer was previously visited in the window, and if so, uses the most recent point at that time. (It's a marker, so it handles changes.) #### Note: It could be argued that doing it on the frame level would be better -- e.g. if you visit a buffer temporarily through a grep, and then go back to that buffer, you presumably want the grep's position rather than some previous position provided everything was in the same frame, even though the grep was in another window in the frame. However, doing it on the frame level fails when you have two windows on the same frame. Perhaps we keep both a window and a frame cache, and use the frame cache if there are no other windows on the frame showing the buffer, else the window's cache? This is probably something to be configurable using a specifier. Suggestions please please please? window.c: Clean up a bit code that deals with the annoyance of window-point vs. point. dialog.el: Function to ask a multiple-choice question, automatically choosing a dialog box or minibuffer representation as necessary. Generalized version of yes-or-no-p, y-or-n-p. files.el: Use get-user-response to ask "yes/no/diff" question when recovering. "diff" means that a diff is displayed between the current file and the autosave. (Converts/deconverts escape-quoted as necessary. No more complaints from you, Mr. Turnbull!) One known problem: when a dialog is used, it's modal, so you can't scroll the diff. Will fix soon. lisp-mode.el: If we're filling a string, don't treat semicolon as a comment, which would give very unfriendly results. Uses `buffer-syntactic-context'. simple.el: all changes back to the beginning. (Useful if you've saved the file in the middle of the changes.) simple.el: Add option kill-word-into-kill-ring, which controls whether words deleted with kill-word, backward-kill-word, etc. are "cut" into the kill ring, or "cleared" into nothingness. (My preference is the latter, by far. I'd almost go so far as suggesting we make it the default, as you can always select a word and then cut it if you want it cut.) menubar-items.el: Add option corresponding to kill-word-into-kill-ring.
author ben
date Thu, 16 May 2002 13:30:58 +0000
parents 376386a54a3c
children 04bc9d2f42c7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1 /* Waiting for papers! */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3 /* Synched up with: FSF 19.31. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5 /*
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6 * Do an unexec() for coff encapsulation. Uses the approach I took
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7 * for AKCL, so don't be surprised if it doesn't look too much like
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8 * the other unexec() routines. Assumes NO_REMAP. Should be easy to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9 * adapt to the emacs style unexec() if that is desired, but this works
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
10 * just fine for me with GCC/GAS/GLD under System V. - Jordan
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
11 */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
12
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
13 #include <sys/types.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
14 #include <sys/fcntl.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
15 #include <sys/file.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
16 #include <stdio.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
17 #include "/usr/gnu/lib/gcc/gcc-include/a.out.h"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
18
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
19 filecpy(to, from, n)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
20 FILE *to, *from;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
21 int n;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
22 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
23 char buffer[BUFSIZ];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
24
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
25 for (;;)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
26 if (n > BUFSIZ) {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
27 fread(buffer, BUFSIZ, 1, from);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
28 fwrite(buffer, BUFSIZ, 1, to);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
29 n -= BUFSIZ;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
30 } else if (n > 0) {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
31 fread(buffer, 1, n, from);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
32 fwrite(buffer, 1, n, to);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
33 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
34 } else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
35 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
36 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
37 /* ****************************************************************
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
38 * unexec
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
39 *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
40 * driving logic.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
41 * ****************************************************************/
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
42 unexec (new_name, a_name, data_start, bss_start, entry_address)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
43 char *new_name, *a_name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
44 unsigned data_start, bss_start, entry_address;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
45 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
46 struct coffheader header1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
47 struct coffscn *tp, *dp, *bp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
48 struct exec header;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
49 int stsize;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
50 char *original_file = a_name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
51 char *save_file = new_name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
52
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
53 char *data_begin, *data_end;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
54 int original_data;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
55 FILE *original, *save;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
56 int n;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
57 char *p;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
58 extern char *sbrk();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
59 char stdin_buf[BUFSIZ], stdout_buf[BUFSIZ];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
60
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
61
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
62 fclose(stdin);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
63 original = fopen(original_file, "r");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
64 if (stdin != original || original->_file != 0) {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
65 fprintf(stderr, "unexec: Can't open the original file.\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
66 exit(1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
67 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
68 setbuf(original, stdin_buf);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
69 fclose(stdout);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
70 unlink(save_file);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
71 n = open (save_file, O_CREAT|O_WRONLY, 0777);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
72 if (n != 1 || (save = fdopen(n, "w")) != stdout) {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
73 fprintf(stderr, "unexec: Can't open the save file.\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
74 exit(1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
75 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
76 setbuf(save, stdout_buf);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
77
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
78 fread(&header1, sizeof(header1), 1, original);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
79 tp = &header1.scns[0];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
80 dp = &header1.scns[1];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
81 bp = &header1.scns[2];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
82 fread(&header, sizeof(header), 1, original);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
83 data_begin=(char *)N_DATADDR(header);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
84 data_end = sbrk(0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
85 original_data = header.a_data;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
86 header.a_data = data_end - data_begin;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
87 header.a_bss = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
88 dp->s_size = header.a_data;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
89 bp->s_paddr = dp->s_vaddr + dp->s_size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
90 bp->s_vaddr = bp->s_paddr;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
91 bp->s_size = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
92 header1.tsize = tp->s_size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
93 header1.dsize = dp->s_size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
94 header1.bsize = bp->s_size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
95 fwrite(&header1, sizeof(header1), 1, save);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
96 fwrite(&header, sizeof(header), 1, save);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
97
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
98 filecpy(save, original, header.a_text);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
99
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
100 for (n = header.a_data, p = data_begin; ; n -= BUFSIZ, p += BUFSIZ)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
101 if (n > BUFSIZ)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
102 fwrite(p, BUFSIZ, 1, save);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
103 else if (n > 0) {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
104 fwrite(p, 1, n, save);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
105 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
106 } else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
107 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
108
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
109 fseek(original, original_data, 1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
110
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
111 filecpy(save, original, header.a_syms+header.a_trsize+header.a_drsize);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
112 fread(&stsize, sizeof(stsize), 1, original);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
113 fwrite(&stsize, sizeof(stsize), 1, save);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
114 filecpy(save, original, stsize - sizeof(stsize));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
115
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
116 fclose(original);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
117 fclose(save);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
118 }