diff options
| author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-06-10 15:08:44 +0000 |
|---|---|---|
| committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-06-10 15:08:44 +0000 |
| commit | e8a0788b249cbac5bf5b2aa2d81bb8f6b29a7a4b (patch) | |
| tree | fcdf3d51b6d60986b634c693d71355867bca82ff /console-tools | |
| parent | d4fea900bdb92d7bba71348a40cb00b6748a8ecc (diff) | |
| download | busybox-w32-e8a0788b249cbac5bf5b2aa2d81bb8f6b29a7a4b.tar.gz busybox-w32-e8a0788b249cbac5bf5b2aa2d81bb8f6b29a7a4b.tar.bz2 busybox-w32-e8a0788b249cbac5bf5b2aa2d81bb8f6b29a7a4b.zip | |
moved biggest stack buffers to malloc space, or made their size configurable
(8k of shell line edit buffer is an overkill)
# make ARCH=i386 bloatcheck
function old new delta
read_line_input 3933 3967 +34
ifaddrlist 348 345 -3
do_loadfont 208 191 -17
edit_file 840 819 -21
.rodata 129112 129080 -32
uncompress 1305 1268 -37
loadfont_main 566 495 -71
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/6 up/down: 34/-181) Total: -147 bytes
Diffstat (limited to 'console-tools')
| -rw-r--r-- | console-tools/loadfont.c | 77 |
1 files changed, 38 insertions, 39 deletions
diff --git a/console-tools/loadfont.c b/console-tools/loadfont.c index 88d7a0401..b046d40e3 100644 --- a/console-tools/loadfont.c +++ b/console-tools/loadfont.c | |||
| @@ -21,43 +21,27 @@ enum { | |||
| 21 | }; | 21 | }; |
| 22 | 22 | ||
| 23 | struct psf_header { | 23 | struct psf_header { |
| 24 | unsigned char magic1, magic2; /* Magic number */ | 24 | unsigned char magic1, magic2; /* Magic number */ |
| 25 | unsigned char mode; /* PSF font mode */ | 25 | unsigned char mode; /* PSF font mode */ |
| 26 | unsigned char charsize; /* Character size */ | 26 | unsigned char charsize; /* Character size */ |
| 27 | }; | 27 | }; |
| 28 | 28 | ||
| 29 | #define PSF_MAGIC_OK(x) ((x).magic1 == PSF_MAGIC1 && (x).magic2 == PSF_MAGIC2) | 29 | #define PSF_MAGIC_OK(x) ((x).magic1 == PSF_MAGIC1 && (x).magic2 == PSF_MAGIC2) |
| 30 | 30 | ||
| 31 | static void loadnewfont(int fd); | ||
| 32 | |||
| 33 | int loadfont_main(int argc, char **argv); | ||
| 34 | int loadfont_main(int argc, char **argv) | ||
| 35 | { | ||
| 36 | int fd; | ||
| 37 | |||
| 38 | if (argc != 1) | ||
| 39 | bb_show_usage(); | ||
| 40 | |||
| 41 | fd = xopen(CURRENT_VC, O_RDWR); | ||
| 42 | loadnewfont(fd); | ||
| 43 | |||
| 44 | return EXIT_SUCCESS; | ||
| 45 | } | ||
| 46 | |||
| 47 | static void do_loadfont(int fd, unsigned char *inbuf, int unit, int fontsize) | 31 | static void do_loadfont(int fd, unsigned char *inbuf, int unit, int fontsize) |
| 48 | { | 32 | { |
| 49 | char buf[16384]; | 33 | char *buf; |
| 50 | int i; | 34 | int i; |
| 51 | 35 | ||
| 52 | memset(buf, 0, sizeof(buf)); | ||
| 53 | |||
| 54 | if (unit < 1 || unit > 32) | 36 | if (unit < 1 || unit > 32) |
| 55 | bb_error_msg_and_die("bad character size %d", unit); | 37 | bb_error_msg_and_die("bad character size %d", unit); |
| 56 | 38 | ||
| 39 | buf = xzalloc(16 * 1024); | ||
| 40 | /*memset(buf, 0, 16 * 1024);*/ | ||
| 57 | for (i = 0; i < fontsize; i++) | 41 | for (i = 0; i < fontsize; i++) |
| 58 | memcpy(buf + (32 * i), inbuf + (unit * i), unit); | 42 | memcpy(buf + (32 * i), inbuf + (unit * i), unit); |
| 59 | 43 | ||
| 60 | #if defined( PIO_FONTX ) && !defined( __sparc__ ) | 44 | #if defined(PIO_FONTX) && !defined(__sparc__) |
| 61 | { | 45 | { |
| 62 | struct consolefontdesc cfd; | 46 | struct consolefontdesc cfd; |
| 63 | 47 | ||
| @@ -66,12 +50,14 @@ static void do_loadfont(int fd, unsigned char *inbuf, int unit, int fontsize) | |||
| 66 | cfd.chardata = buf; | 50 | cfd.chardata = buf; |
| 67 | 51 | ||
| 68 | if (ioctl(fd, PIO_FONTX, &cfd) == 0) | 52 | if (ioctl(fd, PIO_FONTX, &cfd) == 0) |
| 69 | return; /* success */ | 53 | goto ret; /* success */ |
| 70 | bb_perror_msg("PIO_FONTX ioctl error (trying PIO_FONT)"); | 54 | bb_perror_msg("PIO_FONTX ioctl (will try PIO_FONT)"); |
| 71 | } | 55 | } |
| 72 | #endif | 56 | #endif |
| 73 | if (ioctl(fd, PIO_FONT, buf)) | 57 | if (ioctl(fd, PIO_FONT, buf)) |
| 74 | bb_perror_msg_and_die("PIO_FONT ioctl error"); | 58 | bb_perror_msg_and_die("PIO_FONT ioctl"); |
| 59 | ret: | ||
| 60 | free(buf); | ||
| 75 | } | 61 | } |
| 76 | 62 | ||
| 77 | static void | 63 | static void |
| @@ -124,31 +110,30 @@ do_loadtable(int fd, unsigned char *inbuf, int tailsz, int fontsize) | |||
| 124 | 110 | ||
| 125 | static void loadnewfont(int fd) | 111 | static void loadnewfont(int fd) |
| 126 | { | 112 | { |
| 113 | enum { INBUF_SIZE = 32*1024 + 1 }; | ||
| 114 | |||
| 127 | int unit; | 115 | int unit; |
| 128 | unsigned char inbuf[32768]; /* primitive */ | 116 | unsigned inputlth, offset; |
| 129 | unsigned int inputlth, offset; | 117 | /* Was on stack, but 32k is a bit too much: */ |
| 118 | unsigned char *inbuf = xmalloc(INBUF_SIZE); | ||
| 130 | 119 | ||
| 131 | /* | 120 | /* |
| 132 | * We used to look at the length of the input file | 121 | * We used to look at the length of the input file |
| 133 | * with stat(); now that we accept compressed files, | 122 | * with stat(); now that we accept compressed files, |
| 134 | * just read the entire file. | 123 | * just read the entire file. |
| 135 | */ | 124 | */ |
| 136 | inputlth = fread(inbuf, 1, sizeof(inbuf), stdin); | 125 | inputlth = full_read(STDIN_FILENO, inbuf, INBUF_SIZE); |
| 137 | if (ferror(stdin)) | 126 | if (inputlth < 0) |
| 138 | bb_perror_msg_and_die("error reading input font"); | 127 | bb_perror_msg_and_die("error reading input font"); |
| 139 | /* use malloc/realloc in case of giant files; | 128 | if (inputlth >= INBUF_SIZE) |
| 140 | maybe these do not occur: 16kB for the font, | 129 | bb_error_msg_and_die("font too large"); |
| 141 | and 16kB for the map leaves 32 unicode values | ||
| 142 | for each font position */ | ||
| 143 | if (!feof(stdin)) | ||
| 144 | bb_perror_msg_and_die("font too large"); | ||
| 145 | 130 | ||
| 146 | /* test for psf first */ | 131 | /* test for psf first */ |
| 147 | { | 132 | { |
| 148 | struct psf_header psfhdr; | 133 | struct psf_header psfhdr; |
| 149 | int fontsize; | 134 | int fontsize; |
| 150 | int hastable; | 135 | int hastable; |
| 151 | unsigned int head0, head; | 136 | unsigned head0, head; |
| 152 | 137 | ||
| 153 | if (inputlth < sizeof(struct psf_header)) | 138 | if (inputlth < sizeof(struct psf_header)) |
| 154 | goto no_psf; | 139 | goto no_psf; |
| @@ -161,7 +146,7 @@ static void loadnewfont(int fd) | |||
| 161 | if (psfhdr.mode > PSF_MAXMODE) | 146 | if (psfhdr.mode > PSF_MAXMODE) |
| 162 | bb_error_msg_and_die("unsupported psf file mode"); | 147 | bb_error_msg_and_die("unsupported psf file mode"); |
| 163 | fontsize = ((psfhdr.mode & PSF_MODE512) ? 512 : 256); | 148 | fontsize = ((psfhdr.mode & PSF_MODE512) ? 512 : 256); |
| 164 | #if !defined( PIO_FONTX ) || defined( __sparc__ ) | 149 | #if !defined(PIO_FONTX) || defined(__sparc__) |
| 165 | if (fontsize != 256) | 150 | if (fontsize != 256) |
| 166 | bb_error_msg_and_die("only fontsize 256 supported"); | 151 | bb_error_msg_and_die("only fontsize 256 supported"); |
| 167 | #endif | 152 | #endif |
| @@ -177,8 +162,8 @@ static void loadnewfont(int fd) | |||
| 177 | do_loadtable(fd, inbuf + head, inputlth - head, fontsize); | 162 | do_loadtable(fd, inbuf + head, inputlth - head, fontsize); |
| 178 | return; | 163 | return; |
| 179 | } | 164 | } |
| 180 | no_psf: | ||
| 181 | 165 | ||
| 166 | no_psf: | ||
| 182 | /* file with three code pages? */ | 167 | /* file with three code pages? */ |
| 183 | if (inputlth == 9780) { | 168 | if (inputlth == 9780) { |
| 184 | offset = 40; | 169 | offset = 40; |
| @@ -192,3 +177,17 @@ static void loadnewfont(int fd) | |||
| 192 | } | 177 | } |
| 193 | do_loadfont(fd, inbuf + offset, unit, 256); | 178 | do_loadfont(fd, inbuf + offset, unit, 256); |
| 194 | } | 179 | } |
| 180 | |||
| 181 | int loadfont_main(int argc, char **argv); | ||
| 182 | int loadfont_main(int argc, char **argv) | ||
| 183 | { | ||
| 184 | int fd; | ||
| 185 | |||
| 186 | if (argc != 1) | ||
| 187 | bb_show_usage(); | ||
| 188 | |||
| 189 | fd = xopen(CURRENT_VC, O_RDWR); | ||
| 190 | loadnewfont(fd); | ||
| 191 | |||
| 192 | return EXIT_SUCCESS; | ||
| 193 | } | ||
