#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "Liste.h"
#define SIZE 256
//! Listeninitierung: right und left zeigen auf sich selbst, content zeigt auf NULL und lineCounter und nodeCounter werden mit 0 initialisiert
node* init_Liste()
{
node* n = (node*) malloc(sizeof(node));
n -> right = n;
n -> left = n;
n -> content = NULL;
return n;
}
//************************************ Listenfunktionen ***********************************
//! Parameter: 1. aktuelles Element, 2. aktuelles Wort, 3. Dateiname 4. Kopie des Strings, 5. ZeilenCounter
node* anhaengen(node* list, void* neuer_String, void* dateiname, void* (*set)(void*), int counter)//, int counter2)
{
node* kopf = list;
node* aktl_Elem = list;
node* neu_Elem = (node*) malloc(sizeof(node)); //! Speicher für neuen Knoten besorgen
//! Überprüfen, ob Speicher angelegt worden ist
if(neu_Elem == NULL)
{
printf("\n Listenelement konnte nicht angelegt werden, da kein Speicher vorhanden ist! \n");
exit(1);
}
//! nodeCounter bekommt Maximale Anzahl bei jedem Funktionsaufruf der Listenelemente b zugewiesen
//neu_Elem -> nodeCounter = list -> nodeCounter++;
// Wenn Liste leer ist, wird das erste Wort eingefügt
if(kopf == aktl_Elem -> left /*&& aktl_Elem -> content == NULL*/)
{ //printf("Test!\n");
char* conttmp = (char*) set(neuer_String);
//! Blank hinten einfügen
strcat(conttmp, " ");
//! Dateinmane hinten einfügen
strcat(conttmp, (char*) set(dateiname));
//! Blank hinten einfügen
strcat(conttmp, " ");
//! ZeilenCounter für ListenContent in Zeichen umwandeln
char t[6];
sprintf(t, "%i", counter);
//! ZeilenCounter hinten einfügen
strcat(conttmp, (char*)set((void*)t));
//! Alle Parameter in Content einfügen
neu_Elem -> content = set((void*) conttmp);
printf("conttmp: %s\n", (char*) (neu_Elem -> content) );
//printf("conttmp: %s\n", (char*) (neu_Elem -> content) );
//! Neues Element zeigt mit linkem Zeiger auf aktuelles Element (Liste)
neu_Elem -> left = list;
//! Neues Element zeigt mit rechtem Zeiger auf rechten Nachbarn des Aktuellen Elements
neu_Elem -> right = list -> right;
//! Von aktuellem Element auf rechtes Zeigen und von rechtem Element auf mit left auf neues Element zeigen
list -> right-> left = neu_Elem;
//! Von aktuellem Element mit right auf neues Element zeigen
list -> right = neu_Elem;
}
else
{
char* string = NULL;
char* string2 = NULL;
while(kopf != (aktl_Elem = aktl_Elem -> left))
{
string = (char*) aktl_Elem -> content;
int i = 0;
while(string[i] != ' ') i++;
string2 = (char*) malloc(++i);
strncpy(string2, string, i);
//sscanf(string, "%s", string2);
//printf("string: %s\n", string2);
if(strcasecmp((char*) neuer_String, string2) == 0)
{
char* conttmp = (char*) aktl_Elem -> content;
//! ZeilenCounter für ListenContent in Zeichen umwandeln
char t[6];
sprintf(t, "%i", counter);
//! ZeilenCounter hinten einfügen
strcat(conttmp, (char*)set((void*)t));
neu_Elem -> content = set((void*) conttmp);
}
else
{
char* conttmp = (char*) set(neuer_String);
//! Blank hinten einfügen
strcat(conttmp, " ");
//! Dateinmane hinten einfügen
strcat(conttmp, (char*) set(dateiname));
//! Blank hinten einfügen
strcat(conttmp, " ");
//! ZeilenCounter für ListenContent in Zeichen umwandeln
char t[6];
sprintf(t, "%i", counter);
//! ZeilenCounter hinten einfügen
strcat(conttmp, (char*)set((void*)t));
//! Alle Parameter in Content einfügen
neu_Elem -> content = set((void*) conttmp);
//printf("conttmp: %s\n", (char*) (neu_Elem -> content) );
//printf("conttmp: %s\n", (char*) (neu_Elem -> content) );
//! Neues Element zeigt mit linkem Zeiger auf aktuelles Element (Liste)
neu_Elem -> left = list;
//! Neues Element zeigt mit rechtem Zeiger auf rechten Nachbarn des Aktuellen Elements
neu_Elem -> right = list -> right;
//! Von aktuellem Element auf rechtes Zeigen und von rechtem Element auf mit left auf neues Element zeigen
list -> right-> left = neu_Elem;
//! Von aktuellem Element mit right auf neues Element zeigen
list -> right = neu_Elem;
}
//free(string2);
printf("conttmp: %s\n", (char*) (neu_Elem -> content) );
}
}
return neu_Elem;
}
void deleten(struct node* list)
{
//! Zeiger neu setzen
list->right->left = list->left;
list->left->right = list->right;
//! Freigeben des allokierten Speichers
free(list);
//free(list->dateiname);
free(list->content);
}
void delete_all(struct node* list, int wordnumber)
{
int i = 0;
//! Freigeben für Wörter -1 Elemente
while (i<wordnumber)
{
deleten(list);
list=list->left;
i++;
}
//! Freigeben für letztes Wort
deleten(list);
}
/*
void sort(node* list)//, int wortLineCounter)
{
//! Listenkopf - Abbruchbedingung für innere While-Schleife, kopf und aktuelles Element zu Anfang identisch
node* kopf = list;
node* aktl_Elem = list;
//! Für die Sortierung der Liste
void* tmpWort = NULL;
void* tmpFilename = NULL;
int tmpLineCounter = 0;
//Start des Bubblesort-Algorithmus
int i = 0; // Zähler für Äußere While-Schleife - Bubblesort
//! Führt Schleife Wortanzahl mal 2 durch
while(i <= list->nodeCounter*2)
{
//! Solange Listenkopf ungleich aktuellem Element und aktuelles Element ungleich NULL (linksrum)
while(kopf != (aktl_Elem = aktl_Elem -> left) && aktl_Elem -> left -> content != NULL)
{
char* string1 = (char*) aktl_Elem -> content; //!Wort des aktuellen Elements
char* string2 = (char*) aktl_Elem -> left -> content; //!Wort des linken Elements
if(strcasecmp(string1, string2) > 0)
{
//! Wort aus aktuellen Element sichern
tmpWort = aktl_Elem -> content;
//! Wort aus aktuellen Element sichern
tmpFilename = aktl_Elem -> dateiname;
//! Zeilennummer aus aktuellem Element sichern
tmpLineCounter = aktl_Elem -> lineCounter;
//! Wort des linken Elements dem aktuellen Element zuweisen
aktl_Elem -> content = aktl_Elem -> left -> content;
//! Wort des linken Elements dem aktuellen Element zuweisen
aktl_Elem -> dateiname = aktl_Elem -> left -> dateiname;
//! Zeilennummer des linken Elements dem aktuellen Element zuweisen
aktl_Elem -> lineCounter = aktl_Elem -> left -> lineCounter;
//! Gesichertes Wort in linken Nachbarn Einfügen
aktl_Elem -> left -> content = tmpWort;
//! Gesichertes Wort in linken Nachbarn Einfügen
aktl_Elem -> left -> dateiname = tmpFilename;
//! Gesicherts Zeilennummer in linken Nachbarn Einfügen
aktl_Elem -> left -> lineCounter = tmpLineCounter;
}
//! Wenn Wörter gleich sind, soll nach Zeilennummer sortiert werden
if(strcasecmp(string1, string2) == 0)
{
int zeilennr1 = aktl_Elem -> lineCounter;
int zeilennr2 = aktl_Elem -> left ->lineCounter;
if(zeilennr1 > zeilennr2)
{
//! Wort aus aktuellen Element sichern
tmpWort = aktl_Elem -> content;
//! Wort aus aktuellen Element sichern
tmpFilename = aktl_Elem -> dateiname;
//! Zeilennummer aus aktuellem Element sichern
tmpLineCounter = aktl_Elem -> lineCounter;
//! Wort des linken Elements dem aktuellen Element zuweisen
aktl_Elem -> content = aktl_Elem -> left -> content;
//! Wort des linken Elements dem aktuellen Element zuweisen
aktl_Elem -> dateiname = aktl_Elem -> left -> dateiname;
//! Zeilennummer des linken Elements dem aktuellen Element zuweisen
aktl_Elem -> lineCounter = aktl_Elem -> left -> lineCounter;
//! Gesichertes Wort in linken Nachbarn Einfügen
aktl_Elem -> left -> content = tmpWort;
//! Gesichertes Wort in linken Nachbarn Einfügen
aktl_Elem -> left -> dateiname = tmpFilename;
//! Gesicherts Zeilennummer in linken Nachbarn Einfügen
aktl_Elem -> left -> lineCounter = tmpLineCounter;
}
}
}
i++;
}
}
*/
//! Parameter: 1.aktuelles_Element, 2.Kopiertes Wort, 3.Ausgabedatei, 4.Übergebener Optionsparameter
void print_all(node* list, void* (*getcontent)(void*), void* (getfilename)(void*), FILE* file2, char* option)
{
//! Listenkopf - Abbruchbedingung für innere While-Schleife, kopf und aktuelles Element zu Anfang identisch
node* kopf = list;
node* aktl_Elem = list;
char* wort = NULL; // Für den Rückgabewert aus der Funktionsvariablen - getcontent
char* filename = NULL; // Für den Rückgabewert aus der Funktionsvariablen - getfilename
//! Wenn die Liste leer ist soll nichts passieren
if(kopf == NULL && kopf -> content == NULL)
{
return;
}
else
{
int zahl = 0; //! Für den Schwellenwert
/*sscanf(option,"-w=%d", &zahl); //!Ließt Schwellenwert ein
strtok(option, "="); //! Trennt Zeichenfolge, aus option, bis zum = Zeichen ab.
//! Wenn der Optionsparameter '-w=n'gewählt wurde
if(strcasecmp(option, "-w") == 0 && zahl > 1)
{
//! Werden alle Listenelemente abgegangen
while(kopf != (aktl_Elem = aktl_Elem -> left))
{
//! Wenn Listenelemente größer bzw. gleich groß sind werden diese ausgegeben.
if(strlen(aktl_Elem -> content) >= zahl && zahl >= 1 && strlen(aktl_Elem -> content) >= zahl && zahl >= 1)
{
char* string1 = (char*) aktl_Elem -> content; //!Wort des aktuellen Elements
char* string2 = (char*) aktl_Elem -> left -> content; //!Wort des linken Elements
if(strcasecmp(string1, string2) < 0)
{
printf(" %i. ", aktl_Elem -> nodeCounter);
wort = (char*) getcontent(aktl_Elem -> content);
filename = (char*) getfilename(aktl_Elem -> dateiname);
printf(" %i", aktl_Elem -> lineCounter);
if(strcasecmp((char*)aktl_Elem ->left-> content, (char*)aktl_Elem ->left-> left-> content) < 0)
{
printf("\n");
}
fprintf(file2,"%i %s %s %i\n", aktl_Elem -> nodeCounter, wort, filename, aktl_Elem -> lineCounter);
//printf("\nFehler bei fprintf: %i\n\n", h);
}
else if (strcasecmp(string1, string2) == 0)
{
printf(", %i", aktl_Elem -> lineCounter);
if(strcasecmp((char*) aktl_Elem ->left-> content, (char*)aktl_Elem ->left-> left-> content) < 0)
{
printf("\n");
}
fprintf(file2,"%i ", aktl_Elem -> lineCounter);
}
//!Informationen werden anschließend in eine Textdatei einlesen
//fprintf(file2,"%i %s %s %i\n", aktl_Elem -> nodeCounter, wort, filename, aktl_Elem -> lineCounter);
}
}
}*/
//! Wenn der Optionsparameter '-p'gewählt wurde
if(strcasecmp(option, "-p") == 0)
{
char* string1 = NULL;
char* string2 = NULL;
//! Werden alle Listenelemente abgegangen und ausgegeben
while(kopf != (aktl_Elem = aktl_Elem -> left))
{
char* conttmp1 = (char*) aktl_Elem -> content; //!Wort des aktuellen Elements
char* conttmp2 = (char*) aktl_Elem -> left -> content; //!Wort des linken Elements
sscanf(conttmp1, "%s ",string1);
sscanf(conttmp2, "%s ",string2);
//if(strcasecmp(string1, string2) < 0 )
//{
//printf(" %i. ", aktl_Elem -> nodeCounter);
wort = (char*) getcontent(aktl_Elem -> content);
//filename = (char*) getfilename(aktl_Elem -> dateiname);
//printf(" %i", aktl_Elem -> lineCounter);
// if(strcasecmp((char*)aktl_Elem ->left-> content, (char*)aktl_Elem ->left-> left-> content) < 0)
// {
printf("\n");
// }
// fprintf(file2,"%i %s %s %i\n", aktl_Elem -> nodeCounter, wort, filename, aktl_Elem -> lineCounter);
//printf("\nFehler bei fprintf: %i\n\n", h);
//}
/*else if (strcasecmp(string1, string2) == 0)
{
printf(", %i", aktl_Elem -> lineCounter);
if(strcasecmp((char*) aktl_Elem ->left-> content, (char*)aktl_Elem ->left-> left-> content) < 0)
{
printf("\n");
}
fprintf(file2,"%i ", aktl_Elem -> lineCounter);
}*/
//!Informationen werden anschließend in eine Textdatei einlesen
//fprintf(file2,"%i %s %s %i\n", aktl_Elem -> nodeCounter, wort, filename, aktl_Elem -> lineCounter);
}
}
//! Fehlermeldung bei Falscheingabe, vom Anwender.
else
{
printf("\n Falschen Optionsparameter gewählt!\n\n");
printf(" Wählen Sie nach Aufruf './Liste' als Optionsparameter '-p' oder '-w=n' aus!\n");
printf(" - der Optionsparameter '-p' gibt alle Wöter mit der Wordindexnummer aus.\n");
printf(" - Optionsparameter '-w=n' dient als Schwellenwert für Wortlängen. Für 'n'\n");
printf(" wählen Sie einen beliebigen Schwellenwert, der größer ist als 1 \n\n");
}
}
}
//***************************** Funktionen für Funktionsvariablen *************************
//! Kopieren von übergebenem String
void* copyString(void* stringUebergabe)
{
//! Wandelt void zeiger in char zeiger
char* string = (char*) stringUebergabe;
char* speicher = (char*) malloc(sizeof(node/*strlen(string)+1)*/));
//Nach Speicherreservierung immer prüfen, ob auch Speicher vorhanden war!!
if(speicher == NULL)
{
printf("\n Programm wurde beendet, da kein Speicher vorhanden ist! \n");
exit(1);
}
//! Kopiert StringUebergabe in Speicher
strcpy(speicher, string);
return speicher;
}
//! Gibt String der Liste auf Konsole aus
void* printContent(void* contentUebergabe)
{
char* string = (char*) contentUebergabe;
printf(" %s ",string);
return (void*) string;
}
void* printFilename(void* filenameUebergabe)
{
char* string = (char*) filenameUebergabe;
printf(" %s ",string);
return (void*) string;
}
//************************************** Main-Funktion *************************************
int main(int argc, char *argv[])
{
node* kopf = (node*) init_Liste(); //! init_List() wird dem Kopf der Liste zugewiesen
node* aktl_Elem = kopf; //! Zum Anfang wird aktuelles Element auf kopf gesetzt
//! Definition benötiger variablen um die Texfiles zu öffnen, einzulesen und abzuspeichern
char buffer[SIZE];
FILE *file1, *file2;
char splitt[] = ",;.:!?><#'’+*~´`^?[]{}()/\%&$§=|öäüÖÜÄߢ£¤¥¦§ ¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿¡ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÑÒÓÔÕÖ×ØÙÚÛÜÝÐÞßáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ\"\n\0 "; //Definition der Trennzeichen
char* wort;
if(argc > 1 && argv[1] != NULL && (file2 = fopen(argv[2], "w+")) != NULL && (file1 = fopen(argv[3], "r")) != NULL)
{
int i = 3; //! Startpunkt für Eingabedateien
while(i < argc)
{
int counter = 0;
if((file1 = fopen(argv[i], "r")) != NULL)
{
while(fgets(buffer, SIZE, file1) != NULL)
{
counter++; //! Counter für Zeilenanzahl
wort = strtok(buffer, splitt);
while(wort != NULL)
{
//! Wort darf nicht mit folgenden Zeichen beginnen!
if(strncmp(wort,"-",1) != 0 && strncmp(wort,"0",1) != 0 && strncmp(wort,"1",1) != 0
&& strncmp(wort,"2",1) != 0 && strncmp(wort,"3",1) != 0 && strncmp(wort,"4",1) != 0
&& strncmp(wort,"5",1) != 0 && strncmp(wort,"6",1) != 0 && strncmp(wort,"7",1) != 0
&& strncmp(wort,"8",1) != 0 && strncmp(wort,"9",1) != 0)
{
anhaengen(aktl_Elem, wort, argv[i], copyString, counter);
}
//! speichert NULL in wort für Abbruchbedingung
wort = strtok(NULL, splitt);
}
}
fclose(file1);
}
i++;
}
//! Aufruf sortieren von aktuellem Element
//sort(aktl_Elem);
//! Gibt alle Listenelemente aus
//print_all(aktl_Elem, printContent, printFilename, file2, argv[1]);
fclose(file2); //! Da die äußere While-Schleife evtl. mehrere Eingabetextdateien ließt, soll die geschriebene Datei auch solange offen bleiben.
}
//! Fehlermeldung bei Falscheingabe, vom Anwender.
else
{
printf("\n Das Programm wurde mit den falschen Parametern aufgerufen! \n\n");
printf(" Rufen Sie das Programm folgendermaßen auf:\n");
printf(" - './Liste <option> <Ausgabedatei> <Eingabedatei>'. \n");
printf(" - Sie können auch mehrere Eingabedateien übergeben. \n");
printf(" ->'...<Ausgabedatei> <Eingabedatei1>,..,< Eingabedatei<n> >'. \n\n");
exit(1);
}
//! Freigeben von allokiertem Speicher
//delete_all(aktl_Elem, aktl_Elem -> nodeCounter);
free(kopf) ;
return EXIT_SUCCESS;
}