Created
June 10, 2011 12:21
-
-
Save Cospel/1018742 to your computer and use it in GitHub Desktop.
Sorting czech items.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Súbor : proj4.c | |
* Dátum : 11.12.2010 | |
* Autor : Michal Lukáč, xlukac05@stud.fit.vutbr.cz | |
* Projekt : Projekt č.4. České radenie záznamov. | |
* Popis : Tento projekt je projektom do predmetu základy programovania. | |
* P.riadkov: 741 | |
*/ | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#define CMAXCHAR 1000 /* Konštanta pre max. počet znakov v riadku. */ | |
#define CCVAL 200 /* Konštanta pre max. počet znakov v stlpci. */ | |
const int CPVAL = 4; /* Konštanta pre počet povinných parametrov. */ | |
const char CCH = '%'; /* Konštanta pre ch. */ | |
const char CCH_2 = '&'; /* Konštanta pre CH. */ | |
// tabulka českých znakov podľa hodnoty | |
const unsigned char CZTABLE[256] = | |
{ | |
[(unsigned char)' '] = 0, [(unsigned char)'Q'] = 19, | |
[(unsigned char)'A'] = 1, [(unsigned char)'q'] = 19, | |
[(unsigned char)'Á'] = 1, [(unsigned char)'R'] = 20, | |
[(unsigned char)'a'] = 1, [(unsigned char)'r'] = 20, | |
[(unsigned char)'á'] = 1, [(unsigned char)'Ř'] = 21, | |
[(unsigned char)'B'] = 2, [(unsigned char)'ř'] = 21, | |
[(unsigned char)'b'] = 2, [(unsigned char)'S'] = 22, | |
[(unsigned char)'C'] = 3, [(unsigned char)'s'] = 22, | |
[(unsigned char)'c'] = 3, [(unsigned char)'Š'] = 23, | |
[(unsigned char)'Č'] = 4, [(unsigned char)'š'] = 23, | |
[(unsigned char)'č'] = 4, [(unsigned char)'T'] = 24, | |
[(unsigned char)'D'] = 5, [(unsigned char)'Ť'] = 24, | |
[(unsigned char)'Ď'] = 5, [(unsigned char)'t'] = 24, | |
[(unsigned char)'d'] = 5, [(unsigned char)'ť'] = 24, | |
[(unsigned char)'ď'] = 5, [(unsigned char)'U'] = 25, | |
[(unsigned char)'E'] = 6, [(unsigned char)'Ú'] = 25, | |
[(unsigned char)'É'] = 6, [(unsigned char)'Ů'] = 25, | |
[(unsigned char)'Ě'] = 6, [(unsigned char)'u'] = 25, | |
[(unsigned char)'e'] = 6, [(unsigned char)'ú'] = 25, | |
[(unsigned char)'é'] = 6, [(unsigned char)'ů'] = 25, | |
[(unsigned char)'ě'] = 6, [(unsigned char)'V'] = 26, | |
[(unsigned char)'F'] = 7, [(unsigned char)'v'] = 26, | |
[(unsigned char)'f'] = 7, [(unsigned char)'W'] = 27, | |
[(unsigned char)'G'] = 8, [(unsigned char)'w'] = 27, | |
[(unsigned char)'g'] = 8, [(unsigned char)'X'] = 28, | |
[(unsigned char)'H'] = 9, [(unsigned char)'x'] = 28, | |
[(unsigned char)'h'] = 9, [(unsigned char)'Y'] = 29, | |
[(unsigned char)'&'] = 10, [(unsigned char)'y'] = 29, | |
[(unsigned char)'%'] = 10, [(unsigned char)'Ý'] = 29, | |
[(unsigned char)'I'] = 11, [(unsigned char)'ý'] = 29, | |
[(unsigned char)'i'] = 11, [(unsigned char)'Z'] = 30, | |
[(unsigned char)'Í'] = 11, [(unsigned char)'z'] = 30, | |
[(unsigned char)'í'] = 11, [(unsigned char)'Ž'] = 31, | |
[(unsigned char)'J'] = 12, [(unsigned char)'ž'] = 31, | |
[(unsigned char)'j'] = 12, [(unsigned char)'0'] = 32, | |
[(unsigned char)'K'] = 13, [(unsigned char)'1'] = 33, | |
[(unsigned char)'k'] = 13, [(unsigned char)'2'] = 34, | |
[(unsigned char)'L'] = 14, [(unsigned char)'3'] = 35, | |
[(unsigned char)'l'] = 14, [(unsigned char)'4'] = 36, | |
[(unsigned char)'M'] = 15, [(unsigned char)'5'] = 37, | |
[(unsigned char)'m'] = 15, [(unsigned char)'6'] = 38, | |
[(unsigned char)'N'] = 16, [(unsigned char)'7'] = 39, | |
[(unsigned char)'Ň'] = 16, [(unsigned char)'8'] = 40, | |
[(unsigned char)'n'] = 16, [(unsigned char)'9'] = 41, | |
[(unsigned char)'ň'] = 16, [(unsigned char)'.'] = 42, | |
[(unsigned char)'O'] = 17, [(unsigned char)','] = 43, | |
[(unsigned char)'Ó'] = 17, [(unsigned char)';'] = 44, | |
[(unsigned char)'o'] = 18, [(unsigned char)'?'] = 45, | |
[(unsigned char)'ó'] = 18, [(unsigned char)'!'] = 46, | |
[(unsigned char)'P'] = 18, [(unsigned char)':'] = 47, | |
[(unsigned char)'p'] = 18, [(unsigned char)'"'] = 48, | |
[(unsigned char)'-'] = 49, | |
}; | |
// druhá tabulka vyjadrujúca váhy znakov odlišne pre sekundárne porovnanie | |
const unsigned char CZTABLE2[256] = | |
{ | |
[(unsigned char)' '] = 0, [(unsigned char)'Q'] = 26, | |
[(unsigned char)'A'] = 1, [(unsigned char)'q'] = 26, | |
[(unsigned char)'Á'] = 2, [(unsigned char)'R'] = 27, | |
[(unsigned char)'a'] = 1, [(unsigned char)'r'] = 27, | |
[(unsigned char)'á'] = 2, [(unsigned char)'Ř'] = 28, | |
[(unsigned char)'B'] = 3, [(unsigned char)'ř'] = 28, | |
[(unsigned char)'b'] = 3, [(unsigned char)'S'] = 29, | |
[(unsigned char)'C'] = 4, [(unsigned char)'s'] = 29, | |
[(unsigned char)'c'] = 4, [(unsigned char)'Š'] = 30, | |
[(unsigned char)'Č'] = 5, [(unsigned char)'š'] = 30, | |
[(unsigned char)'č'] = 5, [(unsigned char)'T'] = 31, | |
[(unsigned char)'D'] = 6, [(unsigned char)'Ť'] = 32, | |
[(unsigned char)'Ď'] = 7, [(unsigned char)'t'] = 31, | |
[(unsigned char)'d'] = 6, [(unsigned char)'ť'] = 32, | |
[(unsigned char)'ď'] = 7, [(unsigned char)'U'] = 33, | |
[(unsigned char)'E'] = 8, [(unsigned char)'Ú'] = 34, | |
[(unsigned char)'É'] = 9, [(unsigned char)'Ů'] = 35, | |
[(unsigned char)'Ě'] = 10, [(unsigned char)'u'] = 33, | |
[(unsigned char)'e'] = 8, [(unsigned char)'ú'] = 34, | |
[(unsigned char)'é'] = 9, [(unsigned char)'ů'] = 35, | |
[(unsigned char)'ě'] = 10, [(unsigned char)'V'] = 36, | |
[(unsigned char)'F'] = 11, [(unsigned char)'v'] = 36, | |
[(unsigned char)'f'] = 11, [(unsigned char)'W'] = 37, | |
[(unsigned char)'G'] = 12, [(unsigned char)'w'] = 37, | |
[(unsigned char)'g'] = 12, [(unsigned char)'X'] = 38, | |
[(unsigned char)'H'] = 13, [(unsigned char)'x'] = 38, | |
[(unsigned char)'h'] = 13, [(unsigned char)'Y'] = 39, | |
[(unsigned char)'&'] = 14, [(unsigned char)'y'] = 39, | |
[(unsigned char)'%'] = 14, [(unsigned char)'Ý'] = 40, | |
[(unsigned char)'I'] = 15, [(unsigned char)'ý'] = 40, | |
[(unsigned char)'i'] = 15, [(unsigned char)'Z'] = 41, | |
[(unsigned char)'Í'] = 16, [(unsigned char)'z'] = 41, | |
[(unsigned char)'í'] = 16, [(unsigned char)'Ž'] = 42, | |
[(unsigned char)'J'] = 17, [(unsigned char)'ž'] = 42, | |
[(unsigned char)'j'] = 17, [(unsigned char)'0'] = 43, | |
[(unsigned char)'K'] = 18, [(unsigned char)'1'] = 44, | |
[(unsigned char)'k'] = 18, [(unsigned char)'2'] = 45, | |
[(unsigned char)'L'] = 19, [(unsigned char)'3'] = 46, | |
[(unsigned char)'l'] = 19, [(unsigned char)'4'] = 47, | |
[(unsigned char)'M'] = 20, [(unsigned char)'5'] = 48, | |
[(unsigned char)'m'] = 20, [(unsigned char)'6'] = 49, | |
[(unsigned char)'N'] = 21, [(unsigned char)'7'] = 50, | |
[(unsigned char)'Ň'] = 22, [(unsigned char)'8'] = 51, | |
[(unsigned char)'n'] = 21, [(unsigned char)'9'] = 52, | |
[(unsigned char)'ň'] = 22, [(unsigned char)'.'] = 53, | |
[(unsigned char)'O'] = 23, [(unsigned char)','] = 54, | |
[(unsigned char)'Ó'] = 24, [(unsigned char)';'] = 55, | |
[(unsigned char)'o'] = 23, [(unsigned char)'?'] = 56, | |
[(unsigned char)'ó'] = 24, [(unsigned char)'!'] = 57, | |
[(unsigned char)'P'] = 25, [(unsigned char)':'] = 58, | |
[(unsigned char)'p'] = 25, [(unsigned char)'"'] = 59, | |
[(unsigned char)'-'] = 60, | |
}; | |
// Kódy chýb programu | |
enum tecodes | |
{ | |
EOK = 0, /* Bez chyby. */ | |
ECLWRONG = 1, /* Chybný príkazový riadok. */ | |
EFILEO = 2, /* Chyba pri otváraní súboru. */ | |
EMALLOC = 3, /* Chyba pri alokovaní pamäte. */ | |
EFILEL = 4, /* Chyba pri načítaní zo súboru. */ | |
}; | |
// Chybové hlásenia odpovedajúce chybovým kódom tecodes. | |
const char *ECODEMSG[] = | |
{ | |
"\nVsetko je v poriadku.\n", /* EOK */ | |
"\nChybne parametry prikazoveho riadku!\n", /* ECLWRONG */ | |
"\nChyba pri otvarani-zatvarani suboru!\n", /* EFILEO */ | |
"\nChyba pri alokovani pamate!\n", /* EMALLOC */ | |
"\nChyba pri citani/zapisu suboru!\n", /* EFILEL */ | |
}; | |
// Štruktúra obsahujúca hodnoty parametrov z príkazovej riadky | |
typedef struct params | |
{ | |
int ecode; /* Chybový kód programu, odpovedá výčtu tecodes. */ | |
int select; /* Stav pre parameter before = 1; after = 2. */ | |
char selectcolumn[CCVAL]; /* Stav pre vybranie riadkov. */ | |
char printcolumn[CCVAL]; /* Ktorý stĺpec sa má tlačiť. */ | |
int sort; /* Stav pre porovnávanie vzostupne. */ | |
char filesrc[CCVAL]; /* Názov k zdrojovému súboru. */ | |
char filedest[CCVAL]; /* Názov k cieľovému súboru. */ | |
char selecttext[CCVAL]; /* Stav podľa akého reťazca sa bude vyberať. */ | |
} TParams; | |
// Štruktúra pre položku | |
typedef struct item TItem; | |
struct item | |
{ | |
char printitem[CCVAL]; /* Reťazec pre stĺpec print. */ | |
TItem *next; /* Nasledujúci prvok. */ | |
}; | |
// Štruktúra pre zoznam | |
typedef struct | |
{ | |
TItem * first; /* Pointer pre prvý prvok. */ | |
} TList; | |
// Pomocná štruktúra pre orientáciu na riadku | |
typedef struct columns | |
{ | |
int printval; /* Poloha stĺpca pre print. */ | |
int selectval; /* Poloha stĺpca pre select. */ | |
int count; /* Počet stĺpcov. */ | |
} TColumns; | |
// Správa nápovedy | |
const char *HELPMSG = | |
"Program : .\n" | |
"Autor : Michal Lukac, xlukac05@stud.fit.vutbr.cz\n" | |
"Info : Tento program vznikol ako projekt pre predmet Zaklady\n" | |
" programovania na VUT FIT. Ulohou programu je radenie ceskych zaznamov.\n" | |
"Parametre: proj4 -h\n" | |
" --print STLPEC\n" | |
" --after\n" | |
" --before\n" | |
" out.txt in.txt\n" | |
"Popis parametrov:\n" | |
" -h parameter pre vypis napovedy.\n" | |
" --print STLPEC povinny parameter pre vypis podla stlpca.\n" | |
" --after STLPEC TEXT nepovinne parametre pre vyber podla TEXT\n" | |
" --before STLPEC TEXT nepovinne parametre pre vyber podla TEXT\n" | |
" --sort nepovinny parameter pre radenie zaznamov\n"; | |
// prototypy funkcií | |
////////////////////////////////////////////////////////////////////////// | |
TParams getParams(int argc, char *argv[]); // | |
void printHelp(void); // | |
void printECode(int ecode); // | |
int select(TParams * param, TList *slist); // | |
void sort(TList *slist); // | |
int getColumns(char *cl1, char *cl2,char *row,TColumns *colval); // | |
int process(TParams * param); // | |
int strczcmp(char *column,char *selectcolumn); // | |
TParams getParams(int argc, char *argv[]); // | |
void addItem(TItem *sitem,TList *slist); // | |
void freeList(TList *slist); // | |
int readRow(char *row, FILE *fr); // | |
int selsort(TList *slist, char *filename); // | |
void toConvert(char *stringa); // | |
int identifyColumns(FILE *fr, TParams *param, TColumns *colval); // | |
int printList(TList *slist, char *filename); // | |
int strlenght(char *column1,char *scolumn1); // | |
////////////////////////////////////////////////////////////////////////// | |
/** | |
* Funkcia printhelp vytlačí nápovedu a ukonči program. | |
*/ | |
void printHelp(void) | |
{ | |
printf("%s\n",HELPMSG); | |
} | |
/** | |
* Vytlačí hlásenie odpovedajúce chybovému kódu pomocou | |
* výčtového typu a pola reťazcov ECODEMSG. | |
* @param code kód chyby programu. | |
*/ | |
void printECode(int ecode) | |
{ | |
fprintf(stderr, "%s", ECODEMSG[ecode]); | |
} | |
/** | |
* Funkcia getParams spracuje parametre prikazoveho riadku. | |
* @param argc počet parametrov príkazového riadka. | |
* @param argv pole parametrov príkazového riadka. | |
* @return Štruktúra obsahujúca načítané parametre z argumentov príkazového. | |
* riadka | |
*/ | |
TParams getParams(int argc, char *argv[]) | |
{ | |
//inicializácia štruktúry | |
TParams result = | |
{ | |
.ecode = EOK, | |
.select = 0, | |
.sort = 0, | |
}; | |
int required = 0, opt = 1; // premenné určujúce či je všetko zadané | |
if(argc == 1) | |
result.ecode = ECLWRONG; | |
else | |
{ | |
for(int x = 1; x < argc; x++) | |
{ | |
if(strcmp(argv[x],"--print") == 0) // kontrola print | |
{ | |
required++; | |
if(x + 1 < argc) | |
{ | |
opt+= 2; | |
required++; | |
x++; | |
strcpy(result.printcolumn,argv[x]); | |
} | |
else | |
result.ecode = ECLWRONG; | |
} | |
else if(strcmp(argv[x],"--before") == 0) // kontrola --before | |
{ | |
if(x+2 < argc) | |
{ | |
result.select = 1; // before | |
strcpy(result.selectcolumn,argv[x+1]); | |
strcpy(result.selecttext,argv[x+2]); | |
x = x + 2; | |
opt += 3; | |
} | |
else | |
result.ecode = ECLWRONG; | |
} | |
else if(strcmp(argv[x],"--after") == 0) // kontrola --after | |
{ | |
if(x+2 < argc) | |
{ | |
result.select = -1; // after | |
strcpy(result.selectcolumn,argv[x+1]); | |
strcpy(result.selecttext,argv[x+2]); | |
x = x + 2; | |
opt += 3; | |
} | |
else | |
result.ecode = ECLWRONG; | |
} | |
else if(strcmp(argv[x],"--sort") == 0) // kontrola --sort | |
{ | |
result.sort = 1; | |
opt++; | |
} | |
else if(x == argc - 2) // meno zdrojového súbora | |
{ | |
strcpy(result.filesrc,argv[x]); | |
required++; | |
opt++; | |
} | |
else if(x == argc - 1) // meno cieľového súbora | |
{ | |
strcpy(result.filedest,argv[x]); | |
required++; | |
opt++; | |
} | |
else | |
result.ecode = ECLWRONG; | |
} | |
} | |
if(required != CPVAL) // finálna podmienka | |
result.ecode = ECLWRONG; | |
if(opt != argc) | |
result.ecode = ECLWRONG; | |
if(argc == 2) // ak je nápoveda | |
{ | |
if(strcmp(argv[1],"-h") == 0) | |
{ | |
strcpy(result.selectcolumn,argv[1]); | |
result.ecode = EOK; | |
} | |
} | |
return result; // vrátenie spracovaných parametrov | |
} | |
/** | |
* Funkcia addItem pridá položku do zoznamu. | |
* @param sitem je položka na pridanie do zoznamu. | |
* @param slist je zoznam pre pridanie položky. | |
*/ | |
void addItem(TItem *sitem,TList *slist) | |
{ | |
if(slist != NULL && sitem != NULL) | |
{ | |
sitem->next = slist->first; | |
slist->first = sitem; | |
} | |
} | |
/** | |
* Funkcia freeList uvolní jednotlivé položky v zozname. | |
* @param slist je zoznam pre uvolnenie | |
*/ | |
void freeList(TList *slist) | |
{ | |
if(slist !=NULL) | |
{ | |
TItem * it; | |
while(slist->first) | |
{ | |
it = slist->first; | |
slist->first = it->next; | |
free(it); | |
} | |
} | |
} | |
/** | |
* Funkcia printList vytlačí zoznam. | |
* @param slist je lineárny zoznam | |
* @param filename názov súboru | |
* @return úspešnosť funkcie | |
*/ | |
int printList(TList *slist, char *filename) | |
{ | |
FILE *fw; | |
TItem *zoznam; | |
if((fw = fopen(filename,"w")) != NULL) // výpíš zoznam do súboru | |
{ | |
for(zoznam= slist->first;zoznam != NULL ; zoznam = zoznam->next) | |
fprintf(fw,"%s \n",zoznam->printitem); | |
if(fclose(fw) == EOF) return EFILEO; | |
} | |
else | |
return EFILEO; | |
return EOK; | |
} | |
/** | |
* Funkcia readRow prečíta riadok zo súbora. | |
* @param row reťazec pre riadok | |
* @param fr súbor z ktoré čítame riadok | |
*/ | |
int readRow(char *row, FILE *fr) | |
{ | |
int c; // premenná pre čítanie znakov | |
int a = 0; // premenná na indexáciu | |
while((c = fgetc(fr)) != EOF && c != '\n') // cyklus pre načítanie znakov | |
{ | |
row[a] = c; | |
a++; | |
if(a == CMAXCHAR) break; | |
} | |
row[a] = '\0'; // ukončenie reťazca | |
if(c == EOF) return EOF; | |
return 1; | |
} | |
/** | |
* Funkcia identifyColumns identifikuje poriadie stĺpcov. | |
* @param fr štruktúra súbora | |
* @param param štruktúra s údajmi z príkazového riadku | |
* @param colval štruktúra určujúca počet a poradie stĺpcov | |
* @return úspešnosť funkcie | |
*/ | |
int identifyColumns(FILE *fr, TParams *param, TColumns *colval) | |
{ | |
char row[CMAXCHAR]; // pole pre prvý riadok | |
int x = 1; // poloha stĺpca | |
char * column; // ukazatel na stĺpec | |
readRow(row,fr); // prečítanie riadku | |
column = strtok(row," \t\r"); // rozdelenie riadku pomocou strtok | |
while(column != NULL) // rozdelovanie a identifikácia | |
{ | |
if(param->select) | |
if(strcmp(column,param->selectcolumn) == 0) | |
colval->selectval = x; | |
if(strcmp(column,param->printcolumn) == 0) | |
colval->printval = x; | |
x++; | |
column = strtok(NULL," \t\r"); // ďaľšie rozdelenie | |
} | |
colval->count = x-1; | |
if(!param->select) // pokiaľ nie je zadaný after before... | |
colval->selectval = colval->printval; | |
if(param->select && colval->selectval == 0) // pokiaľ param select true ale nič sa nenašlo | |
return EFILEL; | |
if(0 == colval->printval) // pokiaľ sa nič nenašlo pre print | |
return EFILEL; | |
return EOK; | |
} | |
/** | |
* Funkcia getColumns nájde stĺpce pre print a after-before | |
* @param cl1 reťazec pre stĺpec print | |
* @param cl2 reťazec pre stĺpec after-before | |
* @param row reťazec reprezentujúci riadok | |
* @param colval štruktúra určujúca poradie stĺpcov | |
* @return úspešnosť funkcie | |
*/ | |
int getColumns(char *cl1, char *cl2,char *row,TColumns *colval) | |
{ | |
char *column1; // ukazatel na reťazec | |
column1 = strtok(row," \t\r"); // získanie stĺpca | |
int a = 1; // pomocná premenná určujúca poradie stĺpca | |
while(column1 != NULL) // algoritmus pre získanie stĺpcov pomocou strtok | |
{ | |
if(a == colval->printval) | |
strcpy(cl1,column1); | |
if(a == colval->selectval) | |
strcpy(cl2,column1); | |
column1 = strtok(NULL," \t\r"); | |
a++; | |
} | |
if(a != colval->count + 1) | |
return EFILEO; | |
return EOK; | |
} | |
/** | |
* Funkcia to czechTable skonvertuje reťazec pokiaľ v ňom je ch. | |
* @param string retazec pre prekonvertovanie | |
*/ | |
void toConvert(char *stringa) | |
{ | |
char hstring[CCVAL]; // pomocný reťazec | |
int i = strlen(stringa); // prekopírovanie | |
int b = 0; // pomocná premenná pre určenie polohy v reťazci | |
for(int a = 0; a < i; a++) // algoritmus pre hladanie CH | |
{ | |
if(stringa[a] == 'C' && a + 1 < i && stringa[a+1]=='h') | |
{ | |
hstring[b] = CCH; | |
a++; | |
} | |
else if(stringa[a] == 'c' && a + 1 < i && stringa[a+1]=='h') | |
{ | |
hstring[b] = CCH_2; | |
a++; | |
} | |
else | |
hstring[b] = stringa[a]; | |
b++; | |
} | |
hstring[b]='\0'; | |
strcpy(stringa,hstring); // spätné prekopírovanie | |
} | |
/** | |
* Funkcia strlenght porovná dĺžku dvoch reťazcov | |
* @param column1 prvý reťazec | |
* @param scolumn1 druhý reťazec | |
* @return dĺžka menšieho reťazca | |
*/ | |
int strlenght(char *column1,char *scolumn1) | |
{ | |
int i = 0; | |
if(strlen(scolumn1)>strlen(column1)) // porovnanie velkosti položiek | |
i = strlen(scolumn1); | |
else | |
i = strlen(column1); | |
return i; | |
} | |
/** | |
* Funkcia strczcmp porovná dva reťazce podľa českého radenia. | |
* @param column reťazec pre porovnávanie | |
* @param selectcolumn reťazec pre porovnávanie | |
* @return hodnota určujúca ktorý reťazec je abecedne vacsi | |
*/ | |
int strczcmp(char *column,char *selectcolumn) | |
{ | |
int comparevalue = 0; // premenná určujúca rovnosť podľa 1.tabulky | |
char column1[CCVAL]; // pomocný reťazec column | |
char scolumn1[CCVAL]; // pomocný reťazec pre select.. | |
strcpy(column1,column); // prekopírovanie reťazcov | |
strcpy(scolumn1,selectcolumn); | |
toConvert(column1); // konvertovanie reťazca | |
toConvert(scolumn1); | |
int i = strlenght(column1,scolumn1); // porovnanie dvoch reťazcov | |
for(int a = 0; a < i; a++) // porovnanie podľa prvej tabulky | |
{ | |
if(CZTABLE[(unsigned char)column1[a]] < CZTABLE[(unsigned char)scolumn1[a]]) | |
return 1; | |
else if (CZTABLE[(unsigned char)column1[a]] > CZTABLE[(unsigned char)scolumn1[a]]) | |
return -1; | |
else if ((CZTABLE[(unsigned char)column1[a]] == CZTABLE[(unsigned char)scolumn1[a]])) | |
comparevalue = 1; | |
} | |
if(comparevalue) // porovnanie podľa druhej tabulky | |
{ | |
for(int a = 0; a < i; a++) | |
{ | |
if(CZTABLE2[(unsigned char)column1[a]] < CZTABLE2[(unsigned char)scolumn1[a]]) | |
return 1; | |
else if (CZTABLE2[(unsigned char)column1[a]] > CZTABLE2[(unsigned char)scolumn1[a]]) | |
return -1; | |
} | |
} | |
if(strlen(scolumn1) > strlen(column1))// finálne porovnanie | |
return -1; | |
else if(strlen(scolumn1) < strlen(column1)) | |
return 1; | |
return 0; | |
} | |
/** | |
* Funkcia select vybere z textového súboru požadované zložky | |
* @param param je parameter s hodnotami z príkazového riadku | |
* @param rows je štruktúra pre jednotlivé položky | |
* @return úspešnosť funkcie | |
*/ | |
int select(TParams * param, TList *slist) | |
{ | |
char row[CMAXCHAR]; // reťazec pre riadok | |
char cl1[CCVAL]; // reťazec pre stĺpec | |
char cl2[CCVAL]; // reťazec pre stĺpec | |
TItem *item; // ukazatel na položku | |
FILE *fw = NULL; // typ pre súbor | |
FILE *fr = NULL; // typ pre súbor | |
int rvalue; // návratová hodnota funkcie | |
// štruktúra pre spracovanie prvého riadku | |
TColumns colval = {.selectval = 0,.printval = 0,.count = 0,}; | |
if((fr = fopen(param->filesrc,"r")) == NULL) return EFILEO; | |
if((rvalue = identifyColumns(fr,param,&colval))) // identifikovať poradie stĺpcov | |
return rvalue; | |
if(!param->sort) | |
{ | |
if((fw = fopen(param->filedest,"w")) == NULL) | |
{ fclose(fr); return EFILEO;} | |
} | |
while((rvalue = readRow(row,fr))) // podľa identifikacie citat | |
{ | |
if(getColumns(cl1,cl2,row,&colval) != EOK) // získanie stĺpcov | |
{ | |
fclose(fr); | |
if(!param->sort) fclose(fw); | |
if(rvalue == EOF) return EOK; | |
return EFILEL; | |
} | |
if(param->select) | |
{ | |
if(strczcmp(cl2,param->selecttext) == param->select) | |
{ | |
if(param->sort) // ak je sort aj after-before | |
{ | |
item =(TItem *) malloc(sizeof(TItem)); | |
if(item == NULL) | |
{ | |
fclose(fr); | |
return EMALLOC; | |
} | |
strcpy(item->printitem,cl1); | |
addItem(item,slist); | |
} | |
else // inak je iba after-before | |
fprintf(fw,"%s\n",cl1); | |
} | |
} | |
else if(param->sort) // ak je sort | |
{ | |
item =(TItem *) malloc(sizeof(TItem)); | |
if(item == NULL) | |
{ | |
fclose(fr); | |
return EMALLOC; | |
} | |
strcpy(item->printitem,cl1); | |
addItem(item,slist); | |
} | |
else if(!param->select && !param->sort) // inak | |
fprintf(fw,"%s\n",cl1); | |
if(rvalue == EOF) | |
break; | |
} | |
if(param->sort) // uzavretie súbora | |
if(fclose(fr) == EOF) return EFILEO; | |
else | |
{ | |
if(fclose(fr) == EOF) {fclose(fw);return EFILEO;} | |
if(fclose(fw) == EOF) return EFILEO; | |
} | |
return EOK; | |
} | |
/** | |
* Funkcia sort zoradí zoznam pomocou selectsortu. | |
* @param slist je zoznam pre zoradenie | |
* @param filename názov súboru | |
* @return úspešnosť funkcie | |
*/ | |
int selsort(TList *slist, char *filename) | |
{ | |
TItem *zoznam; // ukazatel na položku | |
TItem *zoznam2; // ukazatel na položku | |
TItem x; // pomocná premenná | |
TItem y; // pomocná premenná | |
// algoritmus select sort | |
for(zoznam = slist->first ; zoznam != NULL; zoznam = zoznam->next) | |
{ | |
strcpy(x.printitem,zoznam->printitem); | |
for(zoznam2 = zoznam; zoznam2 != NULL; zoznam2 = zoznam2->next) | |
{ | |
if(strczcmp(zoznam2->printitem,x.printitem) == 1) | |
{ | |
strcpy(y.printitem,x.printitem); | |
strcpy(x.printitem,zoznam2->printitem); | |
strcpy(zoznam2->printitem,y.printitem); | |
} | |
} | |
strcpy(zoznam->printitem,x.printitem); | |
} | |
return printList(slist,filename); | |
} | |
/** | |
* Funkcia process volá funkcie podľa parametra z pr. riadku. | |
* @param param hodnoty príkazového riadku | |
* @return úspečnosť funkcie | |
*/ | |
int process(TParams * param) | |
{ | |
int rvalue = EOK; // návratová hodnota funkcie-úspešnosť | |
TList list; // štruktúra pre záznam | |
list.first = NULL; // inicializácia záznamu | |
rvalue = select(param,&list); | |
if(param->sort && rvalue == EOK) | |
{ | |
rvalue = selsort(&list,param->filedest); | |
} | |
freeList(&list); | |
return rvalue; | |
} | |
/** | |
* Funkcia main volá funkciu pre spracovanie parametrov | |
* a podľa toho prislúchajúce funkcie. | |
* @param argc počet parametrov z príkazového riadku | |
* @param argv jednotlivé položky z príkazového riadku | |
* @return úspešnosť programu | |
*/ | |
int main(int argc, char *argv[]) | |
{ | |
TParams result = getParams(argc, argv); // získanie parametrov z príkazového riadka | |
int error = 0; // chyba nastavená na všetko v poriadku | |
if(result.ecode > EOK) // ak je chyba | |
error = result.ecode; | |
else // inak zavolaj požadovanú funkciu | |
{ | |
if(strcmp(result.selectcolumn,"-h") == 0) | |
printHelp(); | |
else | |
error = process(&result); | |
} | |
if(error) // zavolaj chybový výstup | |
{ | |
printECode(error); | |
return EXIT_FAILURE; | |
} | |
return EXIT_SUCCESS; | |
} | |
// koniec súboru proj4.c od xlukac05 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment