Mercurial > hg > xemacs-beta
annotate lib-src/insert-data-in-exec.c @ 5574:d4f334808463
Support inlining labels, bytecomp.el.
lisp/ChangeLog addition:
2011-10-02 Aidan Kehoe <kehoea@parhasard.net>
* bytecomp.el (byte-compile-initial-macro-environment):
Add #'declare to this, so it doesn't need to rely on
#'cl-compiling file to determine when we're byte-compiling.
Update #'labels to support declaring labels inline, as Common Lisp
requires.
* bytecomp.el (byte-compile-function-form):
Don't error if FUNCTION is quoting a non-lambda, non-symbol, just
return it.
* cl-extra.el (cl-macroexpand-all):
If a label name has been quoted, expand to the label placeholder
quoted with 'function. This allows the byte compiler to
distinguish between uses of the placeholder as data and uses in
contexts where it should be inlined.
* cl-macs.el:
* cl-macs.el (cl-do-proclaim):
When proclaming something as inline, if it is bound as a label,
don't modify the symbol's plist; instead, treat the first element
of its placeholder constant vector as a place to store compile
information.
* cl-macs.el (declare):
Leave processing declarations while compiling to the
implementation of #'declare in
byte-compile-initial-macro-environment.
tests/ChangeLog addition:
2011-10-02 Aidan Kehoe <kehoea@parhasard.net>
* automated/lisp-tests.el:
* automated/lisp-tests.el (+):
Test #'labels and inlining.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Sun, 02 Oct 2011 15:32:16 +0100 |
parents | dfc9fe46c294 |
children | 86d33ddc7fd6 |
rev | line source |
---|---|
4722
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
1 /* Copies the dump file inside the xemacs executable. |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
2 Copyright (C) 2003-2004 Olivier Galibert. |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
3 Copyright (C) 2003 Larry McVoy. |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
4 |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
5 Redistribution and use in source and binary forms, with or without |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
6 modification, are permitted provided that the following conditions are met: |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
7 |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
8 1. Redistributions of source code must retain the above copyright notice, |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
9 this list of conditions and the following disclaimer. |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
10 2. Redistributions in binary form must reproduce the above copyright notice, |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
11 this list of conditions and the following disclaimer in the documentation |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
12 and/or other materials provided with the distribution. |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
13 |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
14 THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
15 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
16 FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL LARRY |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
17 MCVOY, THE XEMACS PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
18 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
19 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
20 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
21 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
22 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
23 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
24 |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
25 The views and conclusions contained in the software and documentation are those |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
26 of the authors and should not be interpreted as representing official policies, |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
27 either expressed or implied, of the XEmacs Project. |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
28 |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
29 The "key" array is the work of Larry McVoy. See |
dfc9fe46c294
Add BSD header to lib-src/insert-data-in-exec.c, with permission of Olivier
Jerry James <james@xemacs.org>
parents:
2502
diff
changeset
|
30 http://lkml.org/lkml/2003/7/11/141 for more information. */ |
2015 | 31 |
32 #include <stdio.h> | |
33 #include <stdlib.h> | |
34 #include <string.h> | |
35 | |
36 static const unsigned char key[] = { | |
37 255, | |
38 6, | |
39 1, | |
40 2, | |
41 3, | |
42 4, | |
43 255, | |
44 3, | |
45 9, | |
46 62, | |
47 255, | |
48 10, | |
49 4, | |
50 61, | |
51 255 | |
52 }; | |
53 | |
54 int main(int argc, char **argv) | |
55 { | |
56 FILE *te, *xe, *dump; | |
57 unsigned char *xed, *p; | |
58 long size, size_dump, size1, i; | |
59 long max_size, offset; | |
60 | |
61 char msg[65536]; | |
62 | |
63 if(argc != 6 && (argc != 3 || strcmp(argv[1], "-s"))) { | |
64 fprintf(stderr, "Usage:\n%s temacs xemacs.dmp xemacs size offset\n%s -s xemacs.dmp\n", argv[0], argv[0]); | |
65 exit(1); | |
66 } | |
67 | |
68 if(argc == 3) { | |
69 sprintf(msg, "Opening %s failed", argv[2]); | |
70 dump = fopen(argv[2], "rb+"); | |
71 if(!dump) { | |
72 perror(msg); | |
73 exit(1); | |
74 } | |
75 | |
76 if(fseek(dump, 0, SEEK_END)) { | |
77 perror("fseek end dump"); | |
78 exit(1); | |
79 } | |
80 | |
81 size = ftell(dump); | |
82 if(size == -1) { | |
83 perror("ftell dump"); | |
84 exit(1); | |
85 } | |
86 | |
87 printf("%ld\n", size); | |
88 exit(0); | |
89 } | |
90 | |
91 | |
92 max_size = strtol(argv[4], 0, 10); | |
93 offset = strtol(argv[5], 0, 10); | |
94 | |
95 sprintf(msg, "Opening %s failed", argv[1]); | |
96 te = fopen(argv[1], "rb"); | |
97 if(!te) { | |
98 perror(msg); | |
99 exit(1); | |
100 } | |
101 | |
102 if(fseek(te, 0, SEEK_END)) { | |
103 perror("fseek end"); | |
104 exit(1); | |
105 } | |
106 | |
107 size = ftell(te); | |
108 if(size == -1) { | |
109 perror("ftell"); | |
110 exit(1); | |
111 } | |
112 | |
113 if(fseek(te, 0, SEEK_SET)) { | |
114 perror("fseek beginning"); | |
115 exit(1); | |
116 } | |
117 | |
118 xed = malloc(size); | |
119 if(!xed) { | |
120 perror("malloc"); | |
121 exit(1); | |
122 } | |
123 | |
124 size1 = fread(xed, 1, size, te); | |
125 if(size1 != size) { | |
126 if(ferror(te)) { | |
127 perror("fread temacs"); | |
128 exit(1); | |
129 } | |
130 fprintf(stderr, "Fread returned %ld, expected %ld ?\n", size1, size); | |
131 exit(1); | |
132 } | |
133 | |
134 if(fclose(te)) { | |
135 perror("fclose temacs"); | |
136 exit(1); | |
137 } | |
138 | |
139 p = xed; | |
140 for(i=0; i<size-(long)sizeof(key); i++) { | |
141 if(!memcmp(p, key, sizeof(key))) | |
142 goto found; | |
143 p++; | |
144 } | |
145 | |
146 fprintf(stderr, "dumped_data key not found in executable.\n"); | |
147 exit(1); | |
148 | |
149 found: | |
150 fprintf(stderr, "dumped_data found at offset 0x%lx, patching.\n", i); | |
151 | |
152 sprintf(msg, "Opening %s failed", argv[2]); | |
2502 | 153 dump = fopen(argv[2], "rb"); |
2015 | 154 if(!dump) { |
155 perror(msg); | |
156 exit(1); | |
157 } | |
158 | |
159 if(fseek(dump, 0, SEEK_END)) { | |
160 perror("fseek end dump"); | |
161 exit(1); | |
162 } | |
163 | |
164 size_dump = ftell(dump); | |
165 if(size_dump == -1) { | |
166 perror("ftell dump"); | |
167 exit(1); | |
168 } | |
169 | |
170 if(size_dump > max_size) { | |
2022 | 171 fprintf(stderr, "Dump file too big for available space (max=%ld, dump=%ld)\n", max_size, size_dump); |
2015 | 172 exit(2); |
173 } | |
174 | |
175 if(fseek(dump, 0, SEEK_SET)) { | |
176 perror("fseek beginning dump"); | |
177 exit(1); | |
178 } | |
179 | |
180 size1 = fread(xed+i+offset, 1, size_dump, dump); | |
181 if(size1 != size_dump) { | |
182 if(ferror(dump)) { | |
183 perror("fread dump"); | |
184 exit(1); | |
185 } | |
186 fprintf(stderr, "Fread dump returned %ld, expected %ld ?\n", size1, size_dump); | |
187 exit(1); | |
188 } | |
189 | |
190 if(fclose(dump)) { | |
191 perror("fclose dump"); | |
192 exit(1); | |
193 } | |
194 | |
195 memset(xed+i, 0, offset); | |
196 | |
197 xed[i ] = size_dump; | |
198 xed[i+1] = size_dump >> 8; | |
199 xed[i+2] = size_dump >> 16; | |
200 xed[i+3] = size_dump >> 24; | |
201 | |
202 fprintf(stderr, "dumped_data found at offset 0x%lx, patching.\n", i); | |
203 | |
204 sprintf(msg, "Opening %s failed", argv[3]); | |
205 xe = fopen(argv[3], "wb"); | |
206 if(!xe) { | |
207 perror(msg); | |
208 exit(1); | |
209 } | |
210 | |
211 size1 = fwrite(xed, 1, size, xe); | |
212 if(size1 != size) { | |
213 if(ferror(xe)) { | |
214 perror("fwrite xemacs"); | |
215 exit(1); | |
216 } | |
217 fprintf(stderr, "Fwrite xemacs returned %ld, expected %ld ?\n", size1, size); | |
218 exit(1); | |
219 } | |
220 | |
221 if(fclose(xe)) { | |
222 perror("fclose xemacs"); | |
223 exit(1); | |
224 } | |
225 | |
226 exit(0); | |
227 } | |
228 |