#include <stdarg.h>

//
// Definition Textkonstanten
//
const char txt00[] = " ";
const char txt01[] = ",";
const char txt02[] = "ab";
const char txt03[] = "auf";
const char txt04[] = "gerundet";
const char txt05[] = "minus";
const char txt06[] = "Max";
const char txt07[] = "Min";
const char txt08[] = " negativ";
const char txt09[] = " plus";
const char txt10[] = " positiv";
const char txt11[] = "Abstand";
const char txt12[] = " Anzahl";
const char txt13[] = "Fehler";
const char txt14[] = " Korrektur";
const char txt15[] = " Regel";
const char txt16[] = "Step";
const char txt17[] = "Zahl";
const char txt18[] = "Zahn";

//
// Zeigerarray auf die Textkonstanten
//
const char* const pTxt[] = {txt00,txt01,txt02,txt03,txt04,txt05,txt06,txt07,txt08,txt09,txt10,txt11,txt12,
                            txt13,txt14,txt15,txt16,txt17,txt18};

//
// Anonymes enum für die INDEX Bezeichner zur besseren Lesbarkeit des
// Programmcodes
//
enum {SPACE,KOMMA,AB,AUF,GERUNDET,MINUS,MAX,MIN,NEGATIV,PLUS,POSITIV,ABSTAND,ANZAHL,FEHLER,
      KORREKTUR,REGEL,STEP,ZAHL,ZAHN};

//
// Forwarddeklaration für die Funktion zur seriellen Ausgabe 
// Diese Funktion hat eine variabe Parameterliste
//
void serialPrint(bool, ...);

//
// Hauptprogramm: Ausgabe der Textkombinationen
//
void setup() {
  Serial.begin(115200);
  serialPrint(true, pTxt[AB],pTxt[GERUNDET], NULL);
  serialPrint(true, pTxt[AUF], pTxt[GERUNDET], NULL);
  serialPrint(true, pTxt[KORREKTUR], pTxt[ZAHN], NULL);
  serialPrint(true, pTxt[KORREKTUR], pTxt[ZAHN], pTxt[POSITIV], NULL);
  serialPrint(true, pTxt[KORREKTUR], pTxt[ZAHN], pTxt[NEGATIV], NULL);
  serialPrint(true, pTxt[REGEL], pTxt[ZAHN], NULL);
  serialPrint(true, pTxt[KORREKTUR], pTxt[ZAHN], pTxt[ABSTAND], NULL);
  serialPrint(true, pTxt[REGEL], pTxt[ZAHN], pTxt[ABSTAND], NULL);
  serialPrint(true, pTxt[ABSTAND], " berechnet", NULL);
  serialPrint(true, "nur gleicher ", pTxt[ABSTAND], NULL);
  serialPrint(true, pTxt[ABSTAND], pTxt[MAX], NULL);
  serialPrint(true, pTxt[ABSTAND], pTxt[MIN], NULL);
  serialPrint(true, pTxt[ABSTAND], pTxt[PLUS], NULL);
  serialPrint(true, pTxt[ABSTAND], pTxt[MINUS], NULL);
  serialPrint(true, pTxt[ABSTAND], pTxt[FEHLER], NULL);
  serialPrint(true, pTxt[STEP], pTxt[ZAHL], " soll", NULL);
  serialPrint(true, pTxt[STEP], pTxt[ZAHL], " ist", NULL);
  serialPrint(true, pTxt[STEP], "s zu viel ", NULL);
  serialPrint(true, pTxt[STEP], "s zu wenig ", NULL);
  serialPrint(true, pTxt[ZAHN], pTxt[STEP], "s ", NULL);
  serialPrint(true, pTxt[ZAHN], pTxt[STEP], "-Nr.: ", NULL);
}

void loop() {
  // put your main code here, to run repeatedly:

}

//
// Ausgabe der Strings, die in der variablen Parameterliste übergeben werden
// Die Parameterliste MUSS! mit NULL abgeschlossen werden, damit das Ende der Parameter-
// liste erkannt werden kann.
// Der erste boolsche Parameter bestimmt, ob nach Ausgabe des letzten Wortes der 
// Liste ein Zeilenumbruch erfolg (true) oder nicht (false)
//
void serialPrint(bool lineFeed, ...) {
  va_list pArgListe;
  char* pText;

  va_start(pArgListe, lineFeed);
  pText = va_arg(pArgListe, char*);
  while( pText!= NULL ) {
    Serial.print(pText);
    pText = va_arg(pArgListe, char*);
  }
  va_end(pArgListe);

  if(lineFeed){
    Serial.println("");
  }
}