/*

Program sixplus
v1.0

54.  SeŸtØte  dvØ  cel   Ÿ¡sla  zadan   v çestkov‚ soustavØ.
Zad n¡ a  vìsledek (rovnØ§ v çestkov‚ soustavØ) vypiçte  na
obrazovku  a  z roveå  pýipojte  na  konec zadan‚ho souboru.
Maxim ln¡ poŸet cifer vstupn¡ch Ÿ¡sel je 10.
vol n¡: sixplus  sŸ¡tanec1  sŸ¡tanec2  cilovy_soubor

*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define z(x) ((x)+48)
#define i(c) ((c)-48)
	// dve makra s parametrem
	// jen prepocitaji znak cisla na opravdove cislo a zpet

int isNumber(char *s) {
  int i;
  for (i = 0; s[i] != 0; i ++) {
    if ((s[i] < '0') || (s[i] > '6')) return 0;
  }
  return 1;
}

char *smazNulu(char *s) {	// smaze prvni nulu, existuje-li, a posune zbytek
  int i, l = strlen(s);
  if (i(s[0]) == 0)   		// je potreba mazat?
    for (i = 0; i < l; i ++) s[i] = s[i+1];	// posunuje znaky
  return s;
}

char *secti(char *c1, char *c2, char *v) {	// secte dve cisla v dekadicke soustave zadana v retezci
  int l1 = strlen(c1), l2 = strlen(c2), lax;	// lax - maximalni delka obou retezcu c1, c2
  int i, cislo = 0, flag = 0;
  lax = (l1>l2)?l1:l2;       			// do lax uloz vetsi z obou velikosti retezcu
  for (i = 0; i < lax; i ++) {			// pro vsechny znaky delej...
    cislo = ((i < l1)?i(c1[l1-i-1]):0) + ((i < l2)?i(c2[l2-i-1]):0) + flag;
		// do cisla uloz soucet dvou cifer na aktualni pozici
		// a pritom zkontroluj, jestli ma retezec tolik cifer,
		// jestli ne, potom pouzij nulu; pricti vlajku
    if (cislo > 6) {				// kdyz bude sectene cislo vetsi nebo rovny 10
      v[lax-i] = z(cislo-7);			// do vysledku uloz jen druhou cifru...
      flag = 1;					// ... a pak ve vlajce zustane jednicka
    } else {
      v[lax-i] = z(cislo);			// jinak staci ulozit cislo samotne a ...
      flag = 0;					// ... pak je vlajka nula
    }
  }
  v[0] = z(flag);				// prvni misto se nikdy nezaplni a tady se muze vlozit vlajka
						// napr: 999 + 1 = 1000
  v[lax+1] = 0;					// retezec ukonci nulou
  return smazNulu(v);				// byla-li vlajka nula, pak neni nutne mit nulu na zactku - smaz ji
}

int main(int argc, char *argv[]) {
  FILE *out;		// vystupni soubor
  char soucet[22];


  if (argc != 4) {	// kontrola poctu argumentu
    printf("Program spuste takto:\n\tbigplus.exe cislo1 cislo2 [vystupni soubor]\n");
    return 0;
  }

  if (strlen(argv[1]) > 10) {	// kontrola delky retezce
    printf("Prilis dlouhe cislo\n");
    return 0;
  }

  if (strlen(argv[2]) > 10) {	// kontrola delky retezce
    printf("Prilis dlouhe cislo\n");
    return 0;
  }

  if (!isNumber(argv[1])) {	// kontrola samotneho cisla
    printf("Spatne zadane cislo\n");
    return 0;
  }

  if (!isNumber(argv[2])) {	// kontrola samotneho cisla
    printf("Spatne zadane cislo\n");
    return 0;
  }

  if ((out = fopen(argv[3], "a+t")) == NULL) {
			// kontrola otevreni souboru
    printf("Nepodarilo se otevrit vystupni soubor: %s\n", argv[3]);
    return 0;
  }


  secti(argv[1], argv[2], soucet);			// tady se oba retezce sectou
  fprintf(out, "%s + %s =\n", argv[1], argv[2]);	// vypis soucet do souboru
  fprintf(out, "%s\n", soucet);				// vypis soucet do souboru
  printf("%s + %s =\n", argv[1], argv[2]);		// vypis soucet do souboru
  printf("%s\n", soucet);				// vypis na obrazovku

  fclose(out);						// uzavri soubor
  return 1;
}
