Nimbin2git.christianimmanuel.de / Games / dvd / test.c

dvd files

last change 2026-09-04 (2 hours ago)

wget https://git.christianimmanuel.de/games/dvd/archive/dvd.tar.gz
test.c 4.8 KB · 143 lines raw

#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>

#define MAX_LINE_LENGTH 1024

// Define the struct to hold the parsed data for each line
typedef struct {
    char *titleId;         // Dynamically allocated
    int ordering;
    char *title;           // Dynamically allocated
    char *region;          // Dynamically allocated
    char *language;        // Dynamically allocated
    char *types;           // Dynamically allocated
    char *attributes;      // Dynamically allocated
    int isOriginalTitle;
} TitleLanguages;

char *strdup(const char *s);

// Function to read and store all lines (as strings)
int processAkaLines(FILE *fh, TitleLanguages **parsed_lines) {
    char line[MAX_LINE_LENGTH];  // Buffer for each line
    int line_count = 0;
    int alloc_size = 10;  // Initial memory allocation size
    *parsed_lines = malloc(alloc_size * sizeof(TitleLanguages));  // Allocate memory for the array of TitleLanguages structs

    if (!*parsed_lines) {
        perror("Memory allocation failed");
        return 0;
    }

    // Read the file line by line
    while (fgets(line, sizeof(line), fh)) {
        // Remove newline character from line
        line[strcspn(line, "\n")] = 0;

        // If we've reached the allocated size, reallocate more memory for TitleLanguages array
        if (line_count >= alloc_size) {
            alloc_size *= 2;  // Double the allocated size
            *parsed_lines = realloc(*parsed_lines, alloc_size * sizeof(TitleLanguages));
            if (!*parsed_lines) {
                perror("Memory reallocation failed");
                return 0;
            }
        }

        TitleLanguages *current_line = &(*parsed_lines)[line_count];

        // Parse the fields from the line and directly store them into the struct
        current_line->titleId = strdup(strtok(line, "\t"));
        current_line->ordering = atoi(strtok(NULL, "\t"));
        current_line->title = strdup(strtok(NULL, "\t"));
        current_line->region = strdup(strtok(NULL, "\t"));
        current_line->language = strdup(strtok(NULL, "\t"));
        current_line->types = strdup(strtok(NULL, "\t"));
        current_line->attributes = strdup(strtok(NULL, "\t"));
        current_line->isOriginalTitle = atoi(strtok(NULL, "\t"));

        // If any memory allocation fails, free all previously allocated memory
        if (!current_line->titleId || !current_line->title || !current_line->region || 
            !current_line->language || !current_line->types || !current_line->attributes) {
            perror("Memory allocation failed");
            return 0;
        }

        line_count++;
    }

    return line_count;  // Return the total number of lines read
}

// Function to read the Akas file and process lines
int readAkas(TitleLanguages **languages) {
    int line_count = 0;
    FILE *fh = NULL;

    // Open the file specified by the constant FILENAME
    fh = fopen("imdb/title.akas.tsv", "r");
    if (!fh) {
        perror("Error opening file");
        return 1;
    }

    // Process lines and get the result
    line_count = processAkaLines(fh, languages);

    // Print a message once all lines are read
    printf("Processing complete. Total lines read: %d\n", line_count);

    // Return the number of lines processed
    return line_count;
}

int main(void) {
    TitleLanguages *languages = NULL;
    int line_count = 0;

    // Pass the address of languages to readAkas
    line_count = readAkas(&languages);

    // Print the first 4 lines and last 4 lines of the struct array
    printf("First and last 4 lines processed:\n");
    for (int i = 0; i < line_count; i++) {
        // Print first 4 lines
        if (i < 4) {
            printf("Line %d: %s, %d, %s, %s, %s, %s, %d\n", i + 1, 
                   languages[i].titleId, 
                   languages[i].ordering, 
                   languages[i].title, 
                   languages[i].region, 
                   languages[i].language, 
                   languages[i].types, 
                   languages[i].isOriginalTitle);
        }
        // Print last 4 lines
        if (i >= line_count - 4) {
            printf("Line %d: %s, %d, %s, %s, %s, %s, %d\n", i + 1, 
                   languages[i].titleId, 
                   languages[i].ordering, 
                   languages[i].title, 
                   languages[i].region, 
                   languages[i].language, 
                   languages[i].types, 
                   languages[i].isOriginalTitle);
        }
    }

    // Clean up the array of structs and the dynamically allocated strings
    for (int i = 0; i < line_count; i++) {
        free(languages[i].titleId);
        free(languages[i].title);
        free(languages[i].region);
        free(languages[i].language);
        free(languages[i].types);
        free(languages[i].attributes);
    }
    free(languages);

    return 0;
}