/* kaki xrisi goto, o allos prepei na akolouthisei tin roi tou kodika gia na katalabei
 * ti ginete, kai oti ayto einai telika ena typiko loop.
 */

void print_arr(int *arr, int sz)
{
	int i = 0;

start:
	printf("%d\n", arr[i]);
	if(i < sz) {
		goto start;
	}
}

/* to sosto fysika kai poly pio eyanagnosto (idika an to body tou loop den itan toso mikro
 * tha itan ayto:
 */
void print_arr(int *arr, int sz)
{
	int i;

	for(i=0; i<sz; i++) {
		printf("%d\n", arr[i]);
	}
}


/* kali xrisi goto.... as doume prota mia synartisi i opoia kanei 3-4 pramata pou mporei na apotyxoun
 * xoris goto tha itan kapos etsi.
 */
struct something *create_something(char *name, char *addr, char *phone)
{
	struct something *foo;

	if(!(foo = malloc(sizeof *foo))) {
		perror("failed to allocate memory");
		return -1;
	}

	if(!(foo->name = malloc(strlen(name) + 1))) {
		perror("failed to allocate memory");
		free(foo);
		return -1;
	}
	strcpy(foo->name, name);

	if(!(foo->addr = malloc(strlen(addr) + 1))) {
		perror("failed to allocate memory");
		free(foo->name);
		free(foo);
		return -1;
	}
	strcpy(foo->addr, addr);

	if(!(foo->phone = malloc(strlen(phone) + 1))) {
		perror("failed to allocate memory");
		free(foo->addr);
		free(foo->name);
		free(foo);
		return -1;
	}
	strcpy(foo->phone, phone);
	/* ... and so on, prosekse oti to megethos tou error handling ginete olo kai megalytero */

	return foo;
}


/* tora o idios kodikas, me goto */
struct something *create_something(char *name, char *addr, char *phone)
{
	struct something *foo = 0;

	if(!(foo = malloc(sizeof *foo))) {
		goto err;
	}
	memset(foo, 0, sizeof *foo);

	if(!(foo->name = malloc(strlen(name) + 1))) {
		goto err;
	}
	strcpy(foo->name, name);

	if(!(foo->addr = malloc(strlen(addr) + 1))) {
		goto err;
	}
	strcpy(foo->addr, addr);

	if(!(foo->phone = malloc(strlen(phone) + 1))) {
		goto err;
	}
	strcpy(foo->phone, phone);

	return 0;
err:
	perror("failed to allocate memory");
	if(foo) {
		free(foo->name);
		free(foo->addr);
		free(foo->phone);
	}
	free(foo);
	return -1;
}
