/* Libpenguin source, written by Tobias Kappé. (http://www.ntlabs.org) Licensed under the CC-BY license, found here: http://creativecommons.org/licenses/by/2.0/ */ #include #include #include typedef enum { male, female } gender; typedef struct { char* name; int pokes; int max_pokes; gender sex; } penguin; penguin *penguin_new(char *name, int max_pokes, gender sex) { penguin* ret_penguin = malloc(sizeof(penguin)); ret_penguin->pokes = 0; ret_penguin->name = malloc(strlen(name)); ret_penguin->sex = sex; strcpy(ret_penguin->name,name); ret_penguin->max_pokes = max_pokes; return ret_penguin; } void penguin_bounce(penguin *p) { printf("*%s bounces*\r\n",p->name); } void penguin_print(penguin *p) { printf("%s: I have been poked %d times so far, thats %d to go!\r\n",p->name,p->pokes,p->max_pokes-p->pokes); } void penguin_poke(penguin *p) { p->pokes++; if(p->pokes > p->max_pokes) { printf("Poke number %d to %s was too much!\r\n",p->pokes,p->name); exit(1); } } penguin *penguin_mate(penguin *first, penguin *second, char *name) { int max, c; if(first->sex == second->sex) { return NULL; } if(!name) { char *g_name; if(strlen(second->name) > strlen(first->name)) { max = (int) strlen(first->name); g_name = malloc(strlen(first->name)); } else { max = (int) strlen(second->name); g_name = malloc(strlen(second->name)); } strcpy(g_name,""); for(c = 0; c < max; c++) { if(c%2 == 0) // even { strncat(g_name,&second->name[c],1); } else // odd { strncat(g_name,&first->name[c],1); } } if(first->sex == male) { return penguin_new(g_name,(first->max_pokes+second->max_pokes)/2, female); } else { return penguin_new(g_name,(first->max_pokes+second->max_pokes)/2, male); } } else { if(first->sex == male) { return penguin_new(name,(first->max_pokes+second->max_pokes)/2, female); } else { return penguin_new(name,(first->max_pokes+second->max_pokes)/2, male); } } }