====== Différences ====== Ci-dessous, les différences entre deux révisions de la page.
|
allegro:code_memfile [2012/01/21 23:34] mrhide créée |
allegro:code_memfile [2015/01/17 03:32] (Version actuelle) mrhide |
||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | Ce code est un programme qui crée un tableau de bytes à partir d'un fichier binaire afin d'être utilisé avec l'addon memfile.\\ | ||
| + | |||
| <file c mem_maker.c> | <file c mem_maker.c> | ||
| #include <stdio.h> | #include <stdio.h> | ||
| #include <stdlib.h> | #include <stdlib.h> | ||
| - | #include <unistd.h> | + | #include <string.h> |
| - | #include <fcntl.h> | + | |
| #define FORMAT "0x%2.2x" | #define FORMAT "0x%2.2x" | ||
| + | #define suffix "};" // 2 bytes | ||
| + | #define prefix "char file_array[] = {" // 21 bytes | ||
| + | #define sep ", " // 2 bytes | ||
| + | #define eol "\n\t" // 2 byte | ||
| #define BYTES_PER_LINES 20 | #define BYTES_PER_LINES 20 | ||
| + | |||
| int main(int argc, char *argv[]) { | int main(int argc, char *argv[]) { | ||
| - | int fd_in, fd_out, i, val; | + | FILE *in, *out; |
| - | char value[BYTES_PER_LINES]; | + | int i, cpt=1; |
| - | char suffix[] = "};"; // 2 bytes | + | size_t val; |
| - | char prefix[] = "char file_array[] = {"; // 21 bytes | + | unsigned char value[BYTES_PER_LINES]; |
| - | char cont [] = "0xFF"; // 4 bytes - la valeur sera changée | + | unsigned char cont[] = "0xFF"; // 4 bytes - la valeur sera changée |
| - | char sep [] = ", "; // 2 bytes | + | unsigned char buflen[25]; |
| - | char eol [] = "\n\t"; // 2 byte | + | |
| if (argc != 3) { | if (argc != 3) { | ||
| - | printf("%s, convertit un fichier binaire en un tableau de char utilisable dans un programme\n", argv[0]); | + | printf("%s, convertit un fichier binaire en un tableau de char utilisable dans un programme\n", argv[0]); |
| - | puts("Ce programme attend 2 arguments de la ligne de commande :"); | + | puts("Ce programme attend 2 arguments de la ligne de commande :"); |
| - | puts("\t- l'@ de la source\n\t- l'@ pour l'output"); | + | puts("\t- le chemin de la source\n\t- le chemin pour l'output"); |
| - | return -1; | + | return -1; |
| } | } | ||
| - | + | ||
| - | if (!(fd_in = open(argv[1], O_RDONLY))) return -1; | + | if (!(in = fopen(argv[1], "rb"))) return -1; |
| - | if (!(fd_out = open(argv[2], O_WRONLY|O_CREAT))) return -1; | + | if (!(out = fopen(argv[2], "wb"))) return fclose(in),-1; |
| - | + | ||
| - | if (read(fd_in, value, 1) != 1) goto cleanup; | + | if (fread(value, sizeof(char), 1, in) != 1) goto cleanup; |
| - | sprintf(cont, FORMAT, value); | + | sprintf(cont, FORMAT, value[0]); |
| - | write(fd_out, prefix, 21); write(fd_out, cont, 4); | + | fwrite(prefix, sizeof(char), 21, out); fwrite(cont, sizeof(char), 4, out); |
| - | + | ||
| - | while ((val = read(fd_in, value, BYTES_PER_LINES)) > 0) { | + | while ((val = fread(value, sizeof(char), BYTES_PER_LINES, in)) > 0) { |
| - | write(fd_out, sep, 2); write(fd_out, eol, 2); | + | fwrite(sep, sizeof(char), 2, out); fwrite(eol, sizeof(char), 2, out); |
| - | for (i=0; i<val; i++) { | + | cpt += val; |
| - | sprintf(cont, FORMAT, *(value+i)); | + | for (i=0; i<val; i++) { |
| - | write(fd_out, cont, 4); | + | sprintf(cont, FORMAT, value[i]); |
| - | if (i != val-1) write(fd_out, sep, 2); | + | fwrite(cont, sizeof(char), 4, out); |
| - | } | + | if (i != val-1) fwrite(sep, sizeof(char), 2, out); |
| + | } | ||
| } | } | ||
| - | write(fd_out, suffix, 2); | + | fwrite(suffix, sizeof(char), 2, out); |
| + | sprintf(buflen, "\n// Longeur = %d", cpt); | ||
| + | fwrite(buflen, sizeof(char), strlen(buflen), out); | ||
| + | |||
| + | fclose(in); fclose(out); | ||
| + | |||
| + | return 0; | ||
| + | |||
| cleanup: | cleanup: | ||
| - | close(fd_in); close(fd_out); | + | fclose(in); fclose(out); |
| + | fputs("conversion failed\n", stderr); | ||
| return 0; | return 0; | ||
| } | } | ||
| - | |||
| </file> | </file> | ||
| + | |||
| + | La taille du tableau est vérifiable en faisant //du -b fichier_binaire// | ||