// jan 1, 2000 = day=1, mo=1, year=0 /* 9*q indexes into the array char phases[83] = "New Moon " "Wax Cres " "1st Qtr " "Wax Gibb " "Full Moon" "Wane Gibb" "3rd Qtr " "Wane Cres" "No Data "; */ unsigned char compute_phase(unsigned char day, unsigned char mo, unsigned char year){ unsigned char q; unsigned int hi, lo, mid; unsigned int probe; probe = (unsigned int)day + 31*((unsigned int)mo+(12*(unsigned int)(year))); if(probe= phase_start[PHASE_DATA_LEN-1]){ q=7; }else{ // Invariant : phase_start[lo] <= probe < phase_start[hi] lo=0; hi= PHASE_DATA_LEN-1; while(hi-lo>1){ mid=lo+( (hi-lo)/2 ); if(probe < phase_start[mid]) hi=mid; else lo=mid; } lo+=INITIAL_PHASE; lo = lo%8; q=lo; } return q; }