Date : 12/05/2012
Version 1
Fichier source disponible ici ogameReader.c
Executable ici (ogameReader.exe)
Fichier batch exemple ogame_Pillage.bat
Fichier exemple t.txt
-----------------------------------------------------------
Date : 18/05/2012
Version 1.1
Fichier source disponible ici ogameReader_V1.1.c
Executable ici (ogameReader_V1.1.exe)
Fichier batch exemple ogame_Pillage.bat
/*******************************************************************************/
/* Allègre Nicolas, (ESISAR P2012) */
/*--------------------------- Fichier C --------------------------------------*/
/* ogameReader.c
*
* But : Pouvoir avoir rapidement la somme des ressources récoltés dans Ogame,
* notamment lors de pillage.
*
*
* Auteur : Allègre Nicolas
* Création : 7 mai 2012
* Modifications :
* - 12 mai 2012 par Allègre Nicolas : Relecture et formatage
* - 12 mai 2012 par Allègre Nicolas : Version 1 complète
* - 18 mai 2012 par Allègre Nicolas : Version 1.1 : Rentabilité formatée pour le forum
*
*/
//20min our la v0
/*******************************************************************************/
/**
* @file ogameReader.c
*
* Fait la somme des ressources de rapport présentes dans un fichier.
*
* @version 12-05-2012, v1
* @author Allègre Nicolas
*
*/
/* Includes ------------------------------------------------------------------*/
/* Standard includes. */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <ctype.h>
#include <inttypes.h>
/* Private define ------------------------------------------------------------*/
//#define DEBUG
#define FALSE 0 //Le booléen FAUX
#define TRUE 1 //le booléen VRAI
#define NBARG_MIN 1 //nombre minimun d'arguments pris par le programme
//#define USE_OF_FLOAT
#define RESSOURCE_METAL 0
#define RESSOURCE_CRISTAL 1
#define RESSOURCE_DEUTERIUM 2
#define RESSOURCE_END 10
/* Exit values define */
//correct value
#define EXIT_OK 0
// Error value
#define EXIT_BAD_ARG_FEW -1
#define EXIT_BAD_OPEN_FILE_R -2
/* Private struct, enum, typedef ---------------------------------------------*/
typedef unsigned int uint;
typedef unsigned long long ulong;
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
void pause(void);
int asking_help(const char s[]); //if the user ask help (-? | /?)
void print_help(void);
void ReadingFile(char *fileName);
void FindFloatValues(char *buf, float *m, float *c, float *d);
void FindIntValues(char *buf, ulong *m, ulong *c, ulong *d);
void PrintfFloatResult(float m, float c, float d);
void PrintfIntResult(ulong m, ulong c, ulong d);
void PrintDoted(FILE *f, ulong n);
ulong DotedToInt(char *buf, int *begin);
void SaveResult(char *fileName, ulong m, ulong c, ulong d);
void PrintFormated(FILE *f, ulong m, ulong c, ulong d);
/* Extern functions ----------------------------------------------------------*/
/* Public functions ----------------------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
int main(int argc, char **argv){
assert(NBARG_MIN >= 0);
atexit(pause);
//Vérification des arguments
if (argc < (1 + 1)) { //help
fprintf(stderr, "ERROR : Too few argument.\n");
print_help();
exit(EXIT_BAD_ARG_FEW);
}
if (argc>1 && asking_help(argv[1])==TRUE) {
print_help();
exit(EXIT_OK);
} else {
if (argc < (1 + NBARG_MIN)) {
fprintf(stderr, "ERROR : Too few argument, need almost %d.\n", NBARG_MIN);
print_help();
exit(EXIT_BAD_ARG_FEW);
}
ReadingFile(argv[1]);
}
return EXIT_OK;
}
void pause(void) {
printf("\n\nVeuillez appuyer sur la touche ENTER !!\n");
getchar();
}
/*--------------------------------------------------------------------------------------------------*/
/** \brief Says if a string is a argument asking help.
*
* Boolean function check the string to find /?, -?, /help or -help.
*
* @param s string to look
*
* @return TRUE if found, FALSE else
*
* @author Allègre Nicolas
* @version 18-10-2010
*/
int asking_help(const char s[]) {
unsigned int longueur = strlen(s);
if (s[0]=='-' || s[0]=='/') {
if (longueur==2 && s[1]=='?') return TRUE;
if (longueur==5) {
if (s[1]=='h' && s[2]=='e' && s[3]=='l' && s[4]=='p') return TRUE;
if (s[1]=='a' && s[2]=='i' && s[3]=='d' && s[4]=='e') return TRUE;
}
}
return FALSE;
}
/*--------------------------------------------------------------------------------------------------*/
/** \brief Print the help.
*
* @author Allègre Nicolas
* @version 12-05-2012
*/
void print_help(void) {
printf("\
Utilisation : ogameReader nom_fichier\n\n\
Sommeur de ressource d'Ogame V1 !!\n\n\
nom_fichier nom ou chemin du fichier contenant les rapports de pillage.\n\n");
}
void ReadingFile(char *fileName) {
FILE *file;
char buf[128];
ulong isommeMetal = 0;
ulong isommeCristal = 0;
ulong isommeDeuterium = 0;
float fsommeMetal = 0.;
float fsommeCristal = 0.;
float fsommeDeuterium = 0.;
file = fopen(fileName, "r");
if(file == NULL){
printf("ERROR : \"%s\" can't be open in reading mode.\n", fileName);
exit(EXIT_BAD_OPEN_FILE_R);
}
//**Lecture dans un fichier :**//
do
{
if(fgets(buf, sizeof(buf), file) == NULL) /*Capture de la ligne dans buf*/
{
if(0 != feof(file)) /*Si c'est la fin du fichier on sort de la boucle*/
break;
else
{
(void)fprintf(stderr,"Erreur de lecture du fichier \"%s\"\n",fileName);
break;
}
}
//action a faire avec buf
#ifdef USE_OF_FLOAT
FindFloatValues(buf, &fsommeMetal, &fsommeCristal, &fsommeDeuterium);
#else
FindIntValues(buf, &isommeMetal, &isommeCristal, &isommeDeuterium);
#endif
} while(!feof(file)); /*Si c'est la fin du fichier on sort de la boucle*/
fclose(file);
#ifdef USE_OF_FLOAT
PrintfFloatResult(fsommeMetal, fsommeCristal, fsommeDeuterium);
#else
PrintfIntResult(isommeMetal, isommeCristal, isommeDeuterium);
#endif
SaveResult(fileName, isommeMetal, isommeCristal, isommeDeuterium);
}
//Ne marche que pour des valeur infereur au million (999.999) (a cause du float)
//temporaire
void FindFloatValues(char *buf, float *m, float *c, float *d) {
float i, j, k;
int result;
result = sscanf(buf, "%f unités de métal, %f unités de cristal et %f", &i, &j, &k);
if(result == 0) {
result = sscanf(buf, "La flotte amène %f unités de métal, %f unités de cristal et %f", &i, &j, &k);
}
if(result == 3) {
printf("%d : Metal=%.4f, Cristal=%.4f, Deuterium=%.4f\n", result, i, j, k);
*m += i*1000;
*c += j*1000;
*d += k*1000;
printf("Total : Metal=%.4f, Cristal=%.4f, Deuterium=%.4f\n\n", *m, *c, *d);
} else{
printf("ERROR : (%d) la ligne ne peut etre lu : \"%s\"\n", result, buf);
}
}
void FindIntValues(char *buf, ulong *m, ulong *c, ulong *d) {
ulong metal = 0, cristal = 0, deuterium = 0;
char tmp;
int i = 0;
int ressource = RESSOURCE_METAL;
char continu = TRUE;
if(buf == NULL) {
return;
}
tmp = buf[0];
while(tmp != '\0' && continu == TRUE) {
if(isdigit(tmp)) {
switch(ressource) {
case RESSOURCE_METAL :
metal = DotedToInt(buf, &i);
ressource = RESSOURCE_CRISTAL;
printf(" Metal, ");
break;
case RESSOURCE_CRISTAL :
cristal = DotedToInt(buf, &i);
ressource = RESSOURCE_DEUTERIUM;
printf(" Cristal, ");
break;
case RESSOURCE_DEUTERIUM :
deuterium = DotedToInt(buf, &i);
ressource = RESSOURCE_END;
printf(" Deuterium.");
//no break
default :
continu = FALSE;
putchar('\n');
break;
}
}
i++;
tmp = buf[i];
}
if(continu == TRUE) {
printf("ERROR : la ligne ne peut etre lu : \"%s\"\n", buf);
}
if(ressource != RESSOURCE_END) {
printf("WARNING : seul %d nombre a ete lu !!\n", ressource);
}
*m += metal;
*c += cristal;
*d += deuterium;
printf("Total : Metal=%"PRIu64", Cristal=%"PRIu64", Deuterium=%"PRIu64"\n\n", *m, *c, *d);
}
void PrintfFloatResult(float m, float c, float d) {
ulong i, j, k;
i = (ulong)m;
j = (ulong)c;
k = (ulong)d;
PrintfIntResult(i, j, k);
}
void PrintfIntResult(ulong m, ulong c, ulong d) {
printf("Rentabilite :\n");
printf("Metal=");
PrintDoted(stdout, m);
printf(", Cristal=");
PrintDoted(stdout, c);
printf(", Deuterium=");
PrintDoted(stdout, d);
putchar('\n');
}
void PrintDoted(FILE *f, ulong n) {
ulong i = 1; //puissance de 10
int j = 0; //Nombre de la puissance de 10 de i
ulong tmp = 0;
char continu = TRUE;
//Avoir laa dernière puissance de dix du nombre
while(continu == TRUE) {
if(n / i == 0) { //On descend jusqu'à l'unité
continu = FALSE;
i /= 10;
j--;
} else {
i *= 10;
j++;
}
}
//Ici i = 10^j
#ifdef DEBUG
printf("\ni=%"PRIu64", ", i);
#endif
continu = TRUE;
tmp = 0;
if(i == 0) {
fprintf(f, "%"PRIu64"", n);
} else {
while(continu == TRUE) {
fprintf(f, "%"PRIu64"", n / i - tmp);
if(j % 3 == 0 && j != 0) {
putc('.', f);
}
tmp = (n / i) * 10;
i /= 10;
j--;
if( i == 0 ) {
continu = FALSE;
}
}
}
}
ulong DotedToInt(char *buf, int *begin) {
ulong result = 0;
char tmp;
int indice;
if(buf == NULL || begin == NULL) {
return 0;
}
indice = *begin;
tmp = buf[indice];
while(tmp != '\0' && isdigit(tmp)) {
result = result * 10 + ((unsigned char)tmp - '0');
indice++;
if(buf[indice] == '.') {
indice++;
}
tmp = buf[indice];
}
printf("%"PRIu64"", result);
*begin = indice - 1;
return result;
}
void SaveResult(char *fileName, ulong m, ulong c, ulong d) {
FILE *file;
file = fopen(fileName, "a");
if(file == NULL){
printf("ERROR : \"%s\" can't be open in reading mode.\n", fileName);
exit(EXIT_BAD_OPEN_FILE_R);
}
PrintFormated(file, m, c, d);
fclose(file);
}
void PrintFormated(FILE *f, ulong m, ulong c, ulong d) {
if(f == NULL) {
return;
}
fprintf(f, "\n[center][color=#00ff00][img]http://img301.imageshack.us/img301/3650/rentaiw0.png[/img]\n[img]http://img451.imageshack.us/img451/3976/metalic2.png[/img] ");
PrintDoted(f, m);
fprintf(f,"\n\n[img]http://img217.imageshack.us/img217/1948/cristalrd2.png[/img] ");
PrintDoted(f, c);
fprintf(f,"\n\n[img]http://img105.imageshack.us/img105/5311/deutym6.png[/img] ");
PrintDoted(f, d);
fprintf(f,"[/color][/center]");
}