mirror of
https://github.com/Mastermindzh/examples.git
synced 2025-09-02 21:34:30 +02:00
consolidation of various example repos/gists
This commit is contained in:
127
c/ani2png.c
Normal file
127
c/ani2png.c
Normal file
@@ -0,0 +1,127 @@
|
||||
//build: gcc ani2png.c -o ani2png
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
void ReadFile(char *name);
|
||||
int teststring(char *buffer, int start);
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
if (argc != 2)
|
||||
{
|
||||
fprintf(stderr, "Usage: ani2png /path.ani");
|
||||
return 0;
|
||||
}
|
||||
ReadFile(*(argv + 1));
|
||||
return 0;
|
||||
}
|
||||
|
||||
int teststring(char *buffer, int start)
|
||||
{
|
||||
if (*(buffer + start) == 0x69)
|
||||
{
|
||||
if (*(buffer + start + 1) == 0x63)
|
||||
{
|
||||
if (*(buffer + start + 2) == 0x6f)
|
||||
{
|
||||
if (*(buffer + start + 3) == 0x6e)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ReadFile(char *name)
|
||||
{
|
||||
FILE *file;
|
||||
char *buffer, *fileName;
|
||||
unsigned long fileLen;
|
||||
|
||||
if (!strstr(name, ".ani"))
|
||||
{
|
||||
fprintf(stderr, "Usage: ani2png /path.ani");
|
||||
return;
|
||||
}
|
||||
|
||||
fileName = malloc(strlen(name) + 1);
|
||||
strcpy(fileName, name);
|
||||
*strstr(fileName, ".ani") = '\0';
|
||||
|
||||
file = fopen(name, "rb");
|
||||
|
||||
fseek(file, 0, SEEK_END);
|
||||
fileLen = ftell(file);
|
||||
fseek(file, 0, SEEK_SET);
|
||||
|
||||
buffer = (char *)malloc(fileLen + 1);
|
||||
|
||||
fread(buffer, fileLen, 1, file);
|
||||
fclose(file);
|
||||
|
||||
char *new_png_name = malloc(strlen(name) + 5);
|
||||
|
||||
char png_counter_string[5];
|
||||
int i, j, png_counter = 1;
|
||||
FILE *png_image;
|
||||
|
||||
for (i = 0; i <= fileLen; i++)
|
||||
{
|
||||
if (png_counter == 9999)
|
||||
{
|
||||
free(fileName);
|
||||
free(buffer);
|
||||
free(new_png_name);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((i + 4 <= fileLen) && teststring(buffer, i) == 1)
|
||||
{
|
||||
sprintf(png_counter_string, "%d", png_counter);
|
||||
strcpy(new_png_name, fileName);
|
||||
strcat(new_png_name, png_counter_string);
|
||||
strcat(new_png_name, ".png");
|
||||
png_counter++;
|
||||
|
||||
png_image = fopen(new_png_name, "wb");
|
||||
if (!png_image)
|
||||
{
|
||||
fprintf(stderr, "Unable to open file %s.\n", new_png_name);
|
||||
free(fileName);
|
||||
free(buffer);
|
||||
free(new_png_name);
|
||||
return;
|
||||
}
|
||||
|
||||
j = 8;
|
||||
while (i + j + 4 <= fileLen)
|
||||
{
|
||||
if (teststring(buffer, i + j + 1) == 1)
|
||||
break;
|
||||
if (j == 10)
|
||||
putc(0x01, png_image);
|
||||
else
|
||||
putc(*(buffer + i + j), png_image);
|
||||
j++;
|
||||
}
|
||||
if (i + j <= fileLen)
|
||||
putc(*(buffer + i + j), png_image);
|
||||
if (fileLen - i - j <= 3)
|
||||
{
|
||||
putc(*(buffer + i + j + 1), png_image);
|
||||
putc(*(buffer + i + j + 2), png_image);
|
||||
}
|
||||
fclose(png_image);
|
||||
i += j;
|
||||
}
|
||||
}
|
||||
|
||||
free(new_png_name);
|
||||
free(buffer);
|
||||
free(fileName);
|
||||
}
|
Reference in New Issue
Block a user