<commit_before>/*********************************************************************************************
**      __________         __           .__            __                ____     ____      **
**      \______   \_____  |  | __  _____|  |__ _____ _/  |______    /\  /_   |   /_   |     **
**       |       _/\__  \ |  |/ / /  ___/  |  \\__  \\   __\__  \   \/   |   |    |   |     **
**       |    |   \ / __ \|    <  \___ \|   Y  \/ __ \|  |  / __ \_ /\   |   |    |   |     **
**       |____|_  /(____  /__|_ \/____  >___|  (____  /__| (____  / \/   |___| /\ |___|     **
**              \/      \/     \/     \/     \/     \/          \/             \/           **
**                                                                                          **
**   Licence propriétaire, code source confidentiel, distribution formellement interdite    **
**                                                                                          **
*********************************************************************************************/

#include "main.h"

MANGAS_DATA* miseEnCache(int mode)
{
	int c = 0, nombreTeam = 0, numeroTeam, nombreMangaDansDepot = 1, numeroManga = 0;
	char ID[NOMBRE_MANGA_MAX][LONGUEUR_ID_TEAM], teamLong[NOMBRE_MANGA_MAX][LONGUEUR_NOM_MANGA_MAX], teamCourt[NOMBRE_MANGA_MAX][LONGUEUR_COURT], type[NOMBRE_MANGA_MAX][LONGUEUR_TYPE_TEAM], URL[NOMBRE_MANGA_MAX][LONGUEUR_URL], site[NOMBRE_MANGA_MAX][LONGUEUR_SITE];
    char *repoDB = loadLargePrefs(SETTINGS_REPODB_FLAG), *repoBak = NULL;
	char *mangaDB = loadLargePrefs(SETTINGS_MANGADB_FLAG), *mangaBak = NULL;

    MANGAS_DATA *mangas = allocateDatabase(NOMBRE_MANGA_MAX);

	if(repoDB == NULL || mangaDB == NULL)
		return NULL;

	for(; *repoDB != 0 && nombreTeam < NOMBRE_MANGA_MAX; nombreTeam++) //Tant qu'on a pas fini de lire le fichier de base de données
    {
        repoDB += sscanfs(repoDB, "%s %s %s %s %s %s", ID[nombreTeam], LONGUEUR_ID_TEAM, teamLong[nombreTeam], LONGUEUR_NOM_MANGA_MAX, teamCourt[nombreTeam], LONGUEUR_COURT, type[nombreTeam], LONGUEUR_TYPE_TEAM, URL[nombreTeam], LONGUEUR_URL, site[nombreTeam], LONGUEUR_SITE);
        for(; *repoDB == '\r' || *repoDB == '\n'; repoDB++);
    }
	free(repoBak);

	char teamLongBuff[LONGUEUR_NOM_MANGA_MAX], teamsCourtBuff[LONGUEUR_COURT], temp[LONGUEUR_NOM_MANGA_MAX * 2 + 100];
	mangaDB += sscanfs(mangaDB,"%s %s", teamLongBuff, LONGUEUR_NOM_MANGA_MAX, teamsCourtBuff, LONGUEUR_COURT);
	for(numeroTeam = 0; numeroTeam < nombreTeam && (strcmp(teamLong[numeroTeam], teamLongBuff) || strcmp(teamCourt[numeroTeam], teamsCourtBuff)); numeroTeam++);

    for(numeroManga = 0; *mangaDB != 0 && numeroManga <= NOMBRE_MANGA_MAX; numeroManga++)
	{
		if(*mangaDB == '#')
		{
		    mangaDB++;
		    for(; *mangaDB == '\r' || *mangaDB == '\n'; mangaDB++);
			mangaDB += sscanfs(mangaDB, "%s %s", teamLongBuff, LONGUEUR_NOM_MANGA_MAX, teamsCourtBuff, LONGUEUR_COURT);
			for(; *mangaDB == '\r' || *mangaDB == '\n'; mangaDB++);

			for(numeroTeam = 0; numeroTeam < nombreTeam && (strcmp(teamLong[numeroTeam], teamLongBuff) || strcmp(teamCourt[numeroTeam], teamsCourtBuff)); numeroTeam++);
			nombreMangaDansDepot = 1;
            numeroManga--;
		}
		else
		{
            int cat = 0;
			mangaDB += sscanfs(mangaDB, "%s %s %d %d %d %d %d %d %d", mangas[numeroManga].mangaName, LONGUEUR_NOM_MANGA_MAX, mangas[numeroManga].mangaNameShort, LONGUEUR_COURT, &mangas[numeroManga].firstChapter, &mangas[numeroManga].lastChapter, &mangas[numeroManga].firstTome, &mangas[numeroManga].lastTome, &cat, &mangas[numeroManga].pageInfos, &mangas[numeroManga].chapitreSpeciauxDisponibles);
            for(; *mangaDB == '\r' || *mangaDB == '\n'; mangaDB++);

            if(mangas[numeroManga].firstChapter > mangas[numeroManga].lastChapter)
			{
			    memset(mangas[numeroManga].mangaName, 0, LONGUEUR_NOM_MANGA_MAX);
				memset(mangas[numeroManga].mangaNameShort, 0, LONGUEUR_COURT);
				mangas[numeroManga].firstChapter = mangas[numeroManga].lastChapter = mangas[numeroManga].pageInfos = 0;
				numeroManga--;
				continue;
			}

            mangas[numeroManga].genre = cat / 10;
            mangas[numeroManga].status = cat % 10;

			if(!mangas[numeroManga].genre) //Si pas à jour, c'est par défaut un shonen
				mangas[numeroManga].genre = 1;

			sprintf(temp, "manga/%s/%s/%s", teamLong[numeroTeam], mangas[numeroManga].mangaName, CONFIGFILE);
			if(checkFileExist(temp) || mode == LOAD_DATABASE_ALL)
			{
                ustrcpy(mangas[numeroManga].team->IDTeam, ID[numeroTeam]);
                ustrcpy(mangas[numeroManga].team->teamLong, teamLong[numeroTeam]);
                ustrcpy(mangas[numeroManga].team->teamCourt, teamCourt[numeroTeam]);
                ustrcpy(mangas[numeroManga].team->type, type[numeroTeam]);
                ustrcpy(mangas[numeroManga].team->URL_depot, URL[numeroTeam]);
                ustrcpy(mangas[numeroManga].team->site, site[numeroTeam]);
                mangas[numeroManga].favoris = checkIfFaved(&mangas[numeroManga], NULL);
				nombreMangaDansDepot++;
			}
			else
			{
				memset(mangas[numeroManga].mangaName, 0, LONGUEUR_NOM_MANGA_MAX);
				memset(mangas[numeroManga].mangaNameShort, 0, LONGUEUR_COURT);
				mangas[numeroManga].firstChapter = mangas[numeroManga].lastChapter = mangas[numeroManga].pageInfos = mangas[numeroManga].favoris = 0;
                numeroManga--;
			}

			if(mode == LOAD_DATABASE_ALL && mangas[numeroManga].chapitreSpeciauxDisponibles && checkUpdateSpecChapter(mangas[numeroManga]))
            {
                get_update_spec_chapter(mangas[numeroManga]);
            }

			if(nombreMangaDansDepot >= NOMBRE_MANGA_MAX_PAR_DEPOT)
			{
				char bufferOutput[100];
				while((c = *(mangaDB++)) != '#' && c != EOF);
				if(c == '#')
					mangaDB--;
				sprintf(temp, "http://%s/System/overuse.php?team=%s", MAIN_SERVER_URL[0], teamLong[numeroTeam]);
				setupBufferDL(bufferOutput, 50, 2, 1, 1);
				download(temp, bufferOutput, 0);
			}
		}
	}
	free(mangaBak);

	qsort(mangas, numeroManga, sizeof(MANGAS_DATA), sortMangas);
	mangas[numeroManga].mangaName[0] = 0;
	return mangas;
}

MANGAS_DATA* allocateDatabase(size_t length)
{
    size_t pos;
    MANGAS_DATA* database = calloc(length, sizeof(MANGAS_DATA));
    for(pos = 0; pos < length; pos++)
        database[pos].team = calloc(1, sizeof(TEAMS_DATA));

    return database;
}

void freeMangaData(MANGAS_DATA* mangasDB, size_t length)
{
    if(mangasDB == NULL)
        return;

    size_t pos = 0;
    for(; pos < length; pos++)
    {
        if(mangasDB[pos].chapitres != NULL)
            free(mangasDB[pos].chapitres);
        free(mangasDB[pos].team);
    }
    free(mangasDB);
}

void updateDataBase()
{
    if(!checkNetworkState(CONNEXION_DOWN))
	{
	    update_repo();
        update_mangas();
	}
}

void get_update_repo(char *buffer_repo, TEAMS_DATA* teams)
{
	char temp[500];
	if(!strcmp(teams->type, TYPE_DEPOT_1))
		sprintf(temp, "http://dl.dropbox.com/u/%s/rakshata-repo-%d", teams->URL_depot, VERSION_REPO);

	else if(!strcmp(teams->type, TYPE_DEPOT_2))
		sprintf(temp, "http://%s/rakshata-repo-%d", teams->URL_depot, VERSION_REPO);

	else if(!strcmp(teams->type, TYPE_DEPOT_3)) //Payant
		sprintf(temp, "https://rsp.%s/ressource.php?editor=%s&request=repo", MAIN_SERVER_URL[0], teams->URL_depot);

	else
	{
	    char temp2[LONGUEUR_NOM_MANGA_MAX + 100];
        snprintf(temp2, LONGUEUR_NOM_MANGA_MAX+100, "failed at read mode(repo): %s", teams->type);
        logR(temp2);
		return;
	}
	download(temp, buffer_repo, 0);
}

void update_repo()
{
	int i = 0, positionDansBuffer = 0;
	int limites[7] = {0, LONGUEUR_ID_TEAM, LONGUEUR_NOM_MANGA_MAX, LONGUEUR_COURT, 10, LONGUEUR_URL, LONGUEUR_SITE}, limiteActuelle[7] = {1, 0, 0, 0, 0, 0, 0};
	char bufferDL[SIZE_BUFFER_UPDATE_DATABASE], repo_new[SIZE_BUFFER_UPDATE_DATABASE], killswitch[NUMBER_MAX_TEAM_KILLSWITCHE][LONGUEUR_ID_TEAM];
	char* repo = loadLargePrefs(SETTINGS_REPODB_FLAG), *repoBak = NULL;
	TEAMS_DATA infosTeam;

	if(repo == NULL)
        return;

    repoBak = repo;
    sprintf(repo_new, "<%c>\n", SETTINGS_REPODB_FLAG);
    positionDansBuffer = strlen(repo_new);

	Load_KillSwitch(killswitch);

	while(*repo != 0 && *repo != '#' && positionDansBuffer < SIZE_BUFFER_UPDATE_DATABASE)
	{
		repo += sscanfs(repo, "%s %s %s %s %s %s", infosTeam.IDTeam, LONGUEUR_ID_TEAM, infosTeam.teamLong, LONGUEUR_NOM_MANGA_MAX, infosTeam.teamCourt, LONGUEUR_COURT, infosTeam.type, LONGUEUR_ID_TEAM, infosTeam.URL_depot, LONGUEUR_URL, infosTeam.site, LONGUEUR_SITE);<commit_msg>Fix an issue at detect the end of the repo's infos line<commit_after>/*********************************************************************************************
**      __________         __           .__            __                ____     ____      **
**      \______   \_____  |  | __  _____|  |__ _____ _/  |______    /\  /_   |   /_   |     **
**       |       _/\__  \ |  |/ / /  ___/  |  \\__  \\   __\__  \   \/   |   |    |   |     **
**       |    |   \ / __ \|    <  \___ \|   Y  \/ __ \|  |  / __ \_ /\   |   |    |   |     **
**       |____|_  /(____  /__|_ \/____  >___|  (____  /__| (____  / \/   |___| /\ |___|     **
**              \/      \/     \/     \/     \/     \/          \/             \/           **
**                                                                                          **
**   Licence propriétaire, code source confidentiel, distribution formellement interdite    **
**                                                                                          **
*********************************************************************************************/

#include "main.h"

MANGAS_DATA* miseEnCache(int mode)
{
	int c = 0, nombreTeam = 0, numeroTeam, nombreMangaDansDepot = 1, numeroManga = 0;
	char ID[NOMBRE_MANGA_MAX][LONGUEUR_ID_TEAM], teamLong[NOMBRE_MANGA_MAX][LONGUEUR_NOM_MANGA_MAX], teamCourt[NOMBRE_MANGA_MAX][LONGUEUR_COURT], type[NOMBRE_MANGA_MAX][LONGUEUR_TYPE_TEAM], URL[NOMBRE_MANGA_MAX][LONGUEUR_URL], site[NOMBRE_MANGA_MAX][LONGUEUR_SITE];
    char *repoDB = loadLargePrefs(SETTINGS_REPODB_FLAG), *repoBak = NULL;
	char *mangaDB = loadLargePrefs(SETTINGS_MANGADB_FLAG), *mangaBak = NULL;

    MANGAS_DATA *mangas = allocateDatabase(NOMBRE_MANGA_MAX);

	if(repoDB == NULL || mangaDB == NULL)
		return NULL;

	for(; *repoDB != 0 && nombreTeam < NOMBRE_MANGA_MAX; nombreTeam++) //Tant qu'on a pas fini de lire le fichier de base de données
    {
        repoDB += sscanfs(repoDB, "%s %s %s %s %s %s", ID[nombreTeam], LONGUEUR_ID_TEAM, teamLong[nombreTeam], LONGUEUR_NOM_MANGA_MAX, teamCourt[nombreTeam], LONGUEUR_COURT, type[nombreTeam], LONGUEUR_TYPE_TEAM, URL[nombreTeam], LONGUEUR_URL, site[nombreTeam], LONGUEUR_SITE);
        for(; *repoDB == '\r' || *repoDB == '\n'; repoDB++);
    }
	free(repoBak);

	char teamLongBuff[LONGUEUR_NOM_MANGA_MAX], teamsCourtBuff[LONGUEUR_COURT], temp[LONGUEUR_NOM_MANGA_MAX * 2 + 100];
	mangaDB += sscanfs(mangaDB,"%s %s", teamLongBuff, LONGUEUR_NOM_MANGA_MAX, teamsCourtBuff, LONGUEUR_COURT);
	for(numeroTeam = 0; numeroTeam < nombreTeam && (strcmp(teamLong[numeroTeam], teamLongBuff) || strcmp(teamCourt[numeroTeam], teamsCourtBuff)); numeroTeam++);

    for(numeroManga = 0; *mangaDB != 0 && numeroManga <= NOMBRE_MANGA_MAX; numeroManga++)
	{
		if(*mangaDB == '#')
		{
		    mangaDB++;
		    for(; *mangaDB == '\r' || *mangaDB == '\n'; mangaDB++);
			mangaDB += sscanfs(mangaDB, "%s %s", teamLongBuff, LONGUEUR_NOM_MANGA_MAX, teamsCourtBuff, LONGUEUR_COURT);
			for(; *mangaDB == '\r' || *mangaDB == '\n'; mangaDB++);

			for(numeroTeam = 0; numeroTeam < nombreTeam && (strcmp(teamLong[numeroTeam], teamLongBuff) || strcmp(teamCourt[numeroTeam], teamsCourtBuff)); numeroTeam++);
			nombreMangaDansDepot = 1;
            numeroManga--;
		}
		else
		{
            int cat = 0;
			mangaDB += sscanfs(mangaDB, "%s %s %d %d %d %d %d %d %d", mangas[numeroManga].mangaName, LONGUEUR_NOM_MANGA_MAX, mangas[numeroManga].mangaNameShort, LONGUEUR_COURT, &mangas[numeroManga].firstChapter, &mangas[numeroManga].lastChapter, &mangas[numeroManga].firstTome, &mangas[numeroManga].lastTome, &cat, &mangas[numeroManga].pageInfos, &mangas[numeroManga].chapitreSpeciauxDisponibles);
            for(; *mangaDB == '\r' || *mangaDB == '\n'; mangaDB++);

            if(mangas[numeroManga].firstChapter > mangas[numeroManga].lastChapter)
			{
			    memset(mangas[numeroManga].mangaName, 0, LONGUEUR_NOM_MANGA_MAX);
				memset(mangas[numeroManga].mangaNameShort, 0, LONGUEUR_COURT);
				mangas[numeroManga].firstChapter = mangas[numeroManga].lastChapter = mangas[numeroManga].pageInfos = 0;
				numeroManga--;
				continue;
			}

            mangas[numeroManga].genre = cat / 10;
            mangas[numeroManga].status = cat % 10;

			if(!mangas[numeroManga].genre) //Si pas à jour, c'est par défaut un shonen
				mangas[numeroManga].genre = 1;

			sprintf(temp, "manga/%s/%s/%s", teamLong[numeroTeam], mangas[numeroManga].mangaName, CONFIGFILE);
			if(checkFileExist(temp) || mode == LOAD_DATABASE_ALL)
			{
                ustrcpy(mangas[numeroManga].team->IDTeam, ID[numeroTeam]);
                ustrcpy(mangas[numeroManga].team->teamLong, teamLong[numeroTeam]);
                ustrcpy(mangas[numeroManga].team->teamCourt, teamCourt[numeroTeam]);
                ustrcpy(mangas[numeroManga].team->type, type[numeroTeam]);
                ustrcpy(mangas[numeroManga].team->URL_depot, URL[numeroTeam]);
                ustrcpy(mangas[numeroManga].team->site, site[numeroTeam]);
                mangas[numeroManga].favoris = checkIfFaved(&mangas[numeroManga], NULL);
				nombreMangaDansDepot++;
			}
			else
			{
				memset(mangas[numeroManga].mangaName, 0, LONGUEUR_NOM_MANGA_MAX);
				memset(mangas[numeroManga].mangaNameShort, 0, LONGUEUR_COURT);
				mangas[numeroManga].firstChapter = mangas[numeroManga].lastChapter = mangas[numeroManga].pageInfos = mangas[numeroManga].favoris = 0;
                numeroManga--;
			}

			if(mode == LOAD_DATABASE_ALL && mangas[numeroManga].chapitreSpeciauxDisponibles && checkUpdateSpecChapter(mangas[numeroManga]))
            {
                get_update_spec_chapter(mangas[numeroManga]);
            }

			if(nombreMangaDansDepot >= NOMBRE_MANGA_MAX_PAR_DEPOT)
			{
				char bufferOutput[100];
				while((c = *(mangaDB++)) != '#' && c != EOF);
				if(c == '#')
					mangaDB--;
				sprintf(temp, "http://%s/System/overuse.php?team=%s", MAIN_SERVER_URL[0], teamLong[numeroTeam]);
				setupBufferDL(bufferOutput, 50, 2, 1, 1);
				download(temp, bufferOutput, 0);
			}
		}
	}
	free(mangaBak);

	qsort(mangas, numeroManga, sizeof(MANGAS_DATA), sortMangas);
	mangas[numeroManga].mangaName[0] = 0;
	return mangas;
}

MANGAS_DATA* allocateDatabase(size_t length)
{
    size_t pos;
    MANGAS_DATA* database = calloc(length, sizeof(MANGAS_DATA));
    for(pos = 0; pos < length; pos++)
        database[pos].team = calloc(1, sizeof(TEAMS_DATA));

    return database;
}

void freeMangaData(MANGAS_DATA* mangasDB, size_t length)
{
    if(mangasDB == NULL)
        return;

    size_t pos = 0;
    for(; pos < length; pos++)
    {
        if(mangasDB[pos].chapitres != NULL)
            free(mangasDB[pos].chapitres);
        free(mangasDB[pos].team);
    }
    free(mangasDB);
}

void updateDataBase()
{
    if(!checkNetworkState(CONNEXION_DOWN))
	{
	    update_repo();
        update_mangas();
	}
}

void get_update_repo(char *buffer_repo, TEAMS_DATA* teams)
{
	char temp[500];
	if(!strcmp(teams->type, TYPE_DEPOT_1))
		sprintf(temp, "http://dl.dropbox.com/u/%s/rakshata-repo-%d", teams->URL_depot, VERSION_REPO);

	else if(!strcmp(teams->type, TYPE_DEPOT_2))
		sprintf(temp, "http://%s/rakshata-repo-%d", teams->URL_depot, VERSION_REPO);

	else if(!strcmp(teams->type, TYPE_DEPOT_3)) //Payant
		sprintf(temp, "https://rsp.%s/ressource.php?editor=%s&request=repo", MAIN_SERVER_URL[0], teams->URL_depot);

	else
	{
	    char temp2[LONGUEUR_NOM_MANGA_MAX + 100];
        snprintf(temp2, LONGUEUR_NOM_MANGA_MAX+100, "failed at read mode(repo): %s", teams->type);
        logR(temp2);
		return;
	}
	download(temp, buffer_repo, 0);
}

void update_repo()
{
	int i = 0, positionDansBuffer = 0;
	int limites[7] = {0, LONGUEUR_ID_TEAM, LONGUEUR_NOM_MANGA_MAX, LONGUEUR_COURT, 10, LONGUEUR_URL, LONGUEUR_SITE}, limiteActuelle[7] = {1, 0, 0, 0, 0, 0, 0};
	char bufferDL[SIZE_BUFFER_UPDATE_DATABASE], repo_new[SIZE_BUFFER_UPDATE_DATABASE], killswitch[NUMBER_MAX_TEAM_KILLSWITCHE][LONGUEUR_ID_TEAM];
	char* repo = loadLargePrefs(SETTINGS_REPODB_FLAG), *repoBak = NULL;
	TEAMS_DATA infosTeam;

	if(repo == NULL)
        return;

    repoBak = repo;
    sprintf(repo_new, "<%c>\n", SETTINGS_REPODB_FLAG);
    positionDansBuffer = strlen(repo_new);

	Load_KillSwitch(killswitch);

	while(*repo != 0 && *repo != '<' && *(repo+1) != '/' && *(repo+2) != SETTINGS_REPODB_FLAG && *(repo+3) != '>' && *(repo+4) != 0 && positionDansBuffer < SIZE_BUFFER_UPDATE_DATABASE)
	{
		repo += sscanfs(repo, "%s %s %s %s %s %s", infosTeam.IDTeam, LONGUEUR_ID_TEAM, infosTeam.teamLong, LONGUEUR_NOM_MANGA_MAX, infosTeam.teamCourt, LONGUEUR_COURT, infosTeam.type, LONGUEUR_ID_TEAM, infosTeam.URL_depot, LONGUEUR_URL, infosTeam.site, LONGUEUR_SITE);
{'fraction_non_alphanumeric': 0.16757072032662584, 'fraction_numerical': 0.008807232429279674, 'mean_word_length': 3.4043154379655793, 'pattern_counts': {'":': 0, '<': 22, '<?xml version=': 0, '>': 38, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 26, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4682864', 'n_tokens_mistral': 7033, 'n_tokens_neox': 6486, 'n_words': 930}