První bonusový úkol

Uvažujme následující strukturu pro řetězec. Položka data není zakončená 0, místo toho si pamatuje svoji délku v položce len.

typedef struct {
    char*  data;
    size_t len;
} string;

Řětězce budeme vytvářet pomocí funkce (není nutno se zabývat jejím tělem, zejména ne funkcí malloc).

string clone_from_cstring(char *cstring) 
{
  string ret = {0};
  ret.len  = strlen(cstring);
  if (ret.len == 0) {
    ret.data = 0;
  }
  else {
    ret.data = malloc(ret.len);
    assert(ret.data);
    memcpy(ret.data, cstring, ret.len);
  }
  return ret;
}

Naprogramujte následující funkce

string get_prefix(string str, char delimiter, string* remainder);

Funkce vrátí prefix řetězce str až do znaku delimiter, který ovšem do výsledku nepatří. Do argumentu remainder zapíše zbytek řetězce bez delimiteru. Tedy pokud spojíme návratovou hodnotu, delimiter a remainder dostaneme str (vše chápáno jako řetězce). Pokud je první symbols str roven delimiter, vrací funkce prázdný řetězec. Pokud str delimiter neobsahuje, je výsledkem celý řetězec. Funkce v tomto případě musí nastavit remainder na prázdný řetězec. Funkce vytváří novou strukturu string, ovšem nealokuje novou pamět pro pole typu char, položka data je ukazatelem do pole, na které ukazuje položka str.data. Stejně tak pro remainder.

int string_to_long(string s, long* result);

Funkce převede číslo zapsané jako řetězec na long. Předpokládáme kódování v desítkové soustavě. Číslo může být záporné. Pokud je s prázdný, je výsledkem převodu 0. Výsledné číslo je zapsáno do argumentu result. Funkce vrací 1, pokud se povedlo číslo z řetězce převést, jinak vrací 0.

int compute_the_thing(string s, long* result);

s je text, který obsahuje na každém řádku mezerami oddělená celá čísla. Funkce vrací číslo, které dostane následovně: čísla v každém řádku sečte; výsledek dostane tak, že sečte součty sudých řádků a od toho odečte součet součtů lichých řádků. Výsledek zapíše do result. Pokud se část řetězce nepovede převést na číslo, vrátí funkce 0, jinak vrací 1. Například, pokud je s

2 2
2 2 2
-2 3

jsou součty řádků 4, 6, 1 a výsledek je -4 + 6 -1 = 1.

Přiložený soubor (.c) se šablonou řešení a nějaké testy. (Původně byl nahrán nesprávný soubor, nyní je soubor správně. Liší se v testech případů, kdy se nedá string převést na číslo. Případné chyby, které tím vzniknou, nebudu penalizovat.)