/*  Här är några C-funktioner, främst för in- och utmatning,
 *  som kanske kan vara användbara
 *  - särskilt för den som inte är så van vid text-I/O i C.
 *
 *  Gratis programvara utan garanti. Använd den hur ni vill, men skyll inte på mig.
 *
 *  Kompilerat och provkört, utan ändringar, på:
 *   Red Hat Linux 8.0, gcc 3.2, unixODBC 2.2.2
 *     Som C: gcc -Wall -o testa-c-funktionerna testa-c-funktionerna.c c-funktioner.c
 *     Som C++: g++ -Wall -o testa-c-funktionerna testa-c-funktionerna.cc c-funktioner.cc
 *   Windows 2000 Professional, Microsoft Visual C++ 6.0
 *   Windows 2000 Professional, Borland C++ Builder 5.0
 *
 *  Thomas Padron-McCarthy (Thomas.Padron-McCarthy@tech.oru.se)
 *  Denna fil senast ändrad: 18 maj 2004
 */

/*---------------------------------------------------------------------------*/

/*  Funktionen "fatal_error" skriver ut ett felmeddelande och avslutar
 *  programmet. Den anropas med en formatsträng och ytterligare argument
 *  på samma sätt som printf.
 */

extern void fatal_error(char* format_string, ...);

/*---------------------------------------------------------------------------*/

/*  Det här är "säkra" versioner av minnesallokeringsfunktionerna
 *  "malloc", "free" m fl. De anropar "fatal_arror" om det inte gick att
 *  allokera det önskade minnet.
 *  Dessutom görs en del kontroller så att funktionerna ska följa
 *  C-standarden även om biblioteksfunktionerna kanske inte gör det.
 */

extern void *safe_malloc(size_t s);
extern void *safe_calloc(size_t n, size_t s);
extern void *safe_realloc(void *p, size_t s);
extern void safe_free(void *p);

/*---------------------------------------------------------------------------*/

/*  Den här funktionen returnerar 1 om användaren svarar 'j', 0 om 'n'.
 *  Om man skriver något annat frågar den om.
 */

extern int ask_yes_or_no(char *question);

/*---------------------------------------------------------------------------*/

/*  "smart_fgets" är en mer "praktisk" variant av funktionen "fgets".
 *  Den gör en del kontroller, och det avslutande radslutstecknet
 *  kommer inte med i bufferten, utan kastas bara bort.
 *  "buffer" ska peka på den plats där den inlästa raden ska lagras,
 *  "buffer_size" är storleken på "buffer" (inklusive den avslutande nul-byten),
 *  och "instream" är den öppna fil man ska läsa från.
 */

extern char *smart_fgets(char *buffer, int buffer_size, FILE *instream);

/*---------------------------------------------------------------------------*/

/*  Funktionen "f_read_line" läser en hel rad från filen "infile"
 *  och returnerar den i en malloc-allokerad sträng.
 *  Det avslutande radslutstecknet kommer inte med i bufferten,
 *  utan kastas bara bort.
 *  Vid filslut returneras NULL.
 */

extern char *f_read_line(FILE *infile);

/*---------------------------------------------------------------------------*/

/*  Funktionen "read_line" läser en hel rad från standardinmatningen
 *  och returnerar den i en malloc-allokerad sträng.
 *  Det avslutande radslutstecknet kommer inte med i bufferten,
 *  utan kastas bara bort.
 *  Vid filslut returneras NULL.
 */

extern char *read_line(void);

/*---------------------------------------------------------------------------*/

/*  Funktionen "f_read_integer" läser ett heltal från filen "infile",
 *  och returnerar det heltalet.
 */

extern int f_read_integer(FILE *infile);

/*---------------------------------------------------------------------------*/

/*  Funktionen "read_integer" läser ett heltal från standardinmatningen,
 *  och returnerar det heltalet.
 */

extern int read_integer(void);

/*---------------------------------------------------------------------------*/

/*  Funktionen "f_read_integer_line" läser en rad från filen "infile",
 *  kollar att den raden verkligen innehåller ett heltal,
 *  och returnerar det heltalet.
 */

extern int f_read_integer_line(FILE *infile);

/*---------------------------------------------------------------------------*/

/*  Funktionen "read_integer_line" läser en rad från standardinmatningen,
 *  kollar att den raden verkligen innehåller ett heltal,
 *  och returnerar det heltalet.
 */

extern int read_integer_line(void);

/*---------------------------------------------------------------------------*/

/* Den här funktionen "kapar bort" blanktecken på slutet i en sträng: */

extern void skip_trailing_space(char *str);

/*---------------------------------------------------------------------------*/

/*  Den här funktionen "slår ihop" två strängar genom att malloc-allokera
 *  plats för resultatet, kopiera dit båda strängarna, och returnera
 *  en pekare till den malloc-allokerade strängen.
 */

extern char *add_strings(char *str1, char *str2);

/*---------------------------------------------------------------------------*/

