Sitzung: Jeden Freitag ab 14:30 s.t. online. Falls ihr den Link haben wollt, schreibt uns.

C-Kurs/Refactoring

Teil 1

Bei dem Programm ist ein Problem aufgetreten, das scheinbar mit der Funktione fgetc() auf verschiedenen Systemen (Linux und Solaris) auftritt. Falls etwas nitcht so ganz hinhaut, verzweifelt nicht und macht einfach eine andere Aufgabe.

Das gegebene Programm ist eine Hashtabelle. Leider ist es etwas unübersichtlich, da es eine Funktion enthält, die ca. 150 Zeilen lang ist. Schaffe mehr Übersicht indem du zusammengehörige Codefragmente oder mehrfach im Quelltext auftauchen in kleinere Funktionen auslagerst. Wie zum Beispiel diese:

int calcHashKey(const char *pszHash)
{
  
}

PHASHITEM getItemFromHash(const char *pszHash)
{
  
}

void execGetHash(const char *pszHash)
{
  
}

void execRemoveHash(const char *pszHash)
{
  
}

void execInsertHash(const char *pszHash, char *pszData)
{
  
}

int parseCmd(const char *pszCmdLine)
{
  
}

char *readLine(size_t *pcbRead)
{
  
}

Halte dich dabei an die Namenskonvention der Ungarischen Notation und Camel Case.

Dokumentiere Jede Funktion und beschreiben genau, was sie macht und welche Ein- und Ausgaben sie hat.

Hier ist die Vorlage: HashTableRefactor.c

Teil 2

Den Algorithmus zum Codieren eines Strings nach base64 aus einer anderen Aufgabe kann man auch noch etwas eleganter und knapper schreiben.

Das Programm erwatet genau einen Kommandozeilenparameter und convertiert diesen nach Base64.

$ ./base64 "Das ist ein Test"
RGFzIGlzdCBlaW4gVGVzdA==

Hier ist die Vorlage: base64_refactor.c

Schreibe eine Funktion encode_block(), die die vier gegebenen encode_*_output() Funktionen ersetzt.

/**
 * Encodes three input chars into four output chars based on the base64 scheme.
 * @param in chararray with input characters
 * @param out chararray where the output is written to
 * @param len number of chars to be used from input
 */
void encode_block( unsigned char in[3], unsigned char out[4], int len )
{
  /* ... */
}

Ersetze die Aufrufe der vier Funktionen an den drei Stellen im Code durch einen Aufruf der Funktion encode_block().

Zusatz

Vereinfache den Code so, dass die Funktion encode_block() nur einmal aufgerufen wird. Lagere den Algorithmus zum Codieren in eine Funktion encode() aus. Initialisierung und Benutzerinteraktion soll in der main() umgesetzt werden.

/**
 * Encodes the input string into an output string based on the base64 scheme.
 * @param length size of input string
 * @param input string with input characters
 * @param output string where the output is written to. It has to be long enough to hold the output
 */
void encode(int length, char *input, char *output)
{
  /* ... */
}