Skip to content

Instantly share code, notes, and snippets.

@weirddan455
Last active November 17, 2021 16:04
Show Gist options
  • Save weirddan455/530cc599ea0f1e268a27be8ac2061cec to your computer and use it in GitHub Desktop.
Save weirddan455/530cc599ea0f1e268a27be8ac2061cec to your computer and use it in GitHub Desktop.
Program to extract Arena Ids from MTGJson dataset
#include <fcntl.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
typedef struct Card
{
int id;
char name[128];
} Card;
Card cards[10000];
int main()
{
int fd = open("AllPrintings.json", O_RDONLY);
if (fd == -1)
{
puts("Failed to open file");
return 1;
}
struct stat fileInfo;
if (fstat(fd, &fileInfo) != 0)
{
puts("fstat failed");
close(fd);
return 1;
}
char *log = malloc(fileInfo.st_size);
if (log == NULL)
{
puts("malloc failed");
close(fd);
return 1;
}
if (read(fd, log, fileInfo.st_size) != fileInfo.st_size)
{
puts("read failed");
close(fd);
return 1;
}
close(fd);
const char *arenaId = "mtgArenaId";
const char *name = "name";
int numCards = 0;
for (int i = 0; i < fileInfo.st_size - 9; i++)
{
if (memcmp(arenaId, &log[i], 10) == 0)
{
i += 14;
char id[8];
int j = 0;
while (log[i] > 47 && log[i] < 58)
{
id[j] = log[i];
i++;
j++;
}
id[j] = 0;
cards[numCards].id = atoi(id);
while (memcmp(name, &log[i], 4) != 0)
{
i++;
}
i += 8;
j = 0;
while (log[i] != '"')
{
cards[numCards].name[j] = log[i];
i++;
j++;
}
cards[numCards].name[j] = 0;
numCards++;
}
}
free(log);
// Bubble sort by id
for (int i = 0; i < numCards - 1; i++)
{
bool sorted = true;
for (int j = 0; j < numCards - 1; j++)
{
if (cards[j].id > cards[j + 1].id)
{
Card temp = cards[j];
cards[j] = cards[j + 1];
cards[j + 1] = temp;
sorted = false;
}
}
if (sorted)
{
break;
}
}
// Remove true duplicates
for (int i = 0; i < numCards - 1; i++)
{
if (cards[i].id == cards[i + 1].id && strcmp(cards[i].name, cards[i + 1].name) == 0)
{
for (int j = i + 1; j < numCards - 1; j++)
{
cards[j] = cards[j + 1];
}
numCards--;
}
printf("%d %s\n", cards[i].id, cards[i].name);
}
printf("%d %s\n", cards[numCards - 1].id, cards[numCards - 1].name);
// Print duplicate ids with different cards names (not sure why these exist, maybe an error in mtgjson dataset?)
puts("\nDuplicates with different card names:\n");
for (int i = 0; i < numCards - 1; i++)
{
if (cards[i].id == cards[i + 1].id)
{
printf("%d %s\n%d %s\n", cards[i].id, cards[i].name, cards[i + 1].id, cards[i + 1].name);
}
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment