Skip to content

Instantly share code, notes, and snippets.

@Cospel
Created June 10, 2011 12:21
Show Gist options
  • Save Cospel/1018742 to your computer and use it in GitHub Desktop.
Save Cospel/1018742 to your computer and use it in GitHub Desktop.
Sorting czech items.
/*
* 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