void break_loop() { int k=0; if(FAIL==has_loop()) return; /* no point doign the function. */ struct node *p = start; struct node *pp = p; while(p && pp) { p= p->next; k++; if(p) pp=p->next; if(pp==p) break; }//same code as has loop, but we break! // METHOD-1 (INEFFICIENT) // we can start fresh. and put all numbers in hash, or mark visited untill we visit again. then we know the end node and we can remove the link. // METHOD-2 (FLOYD LOOP DETECTION AND REMOVAL // put counter with slow pointer, and at point of loop, let that value be k. // now restart, with 2 pointers, // p at speed 1 at location 0, // p pat speed 1 at location k.. // the point they meet again is the node. (so, keep another pointer for prev node). p = start->next; // p is at 1st node pp=start; for(int i=0;i<k;i++) pp=pp->next; // pp is now at kth node pp = pp->next; // pp is at k+1 node. struct node *old=start; while(p!=pp) { old = pp; p = p->next; pp=p->next; } if(pp=p) old->next = 0; //link removed. }
int AudioStreamPlaybackOGGVorbis::mix(int16_t* p_bufer,int p_frames) { if (!playing) return 0; int total=p_frames; while (true) { int todo = p_frames; if (todo==0 || todo<MIN_MIX) { break; } //printf("to mix %i - mix me %i bytes\n",to_mix,to_mix*stream_channels*sizeof(int16_t)); #ifdef BIG_ENDIAN_ENABLED long ret=ov_read(&vf,(char*)p_bufer,todo*stream_channels*sizeof(int16_t), 1, 2, 1, ¤t_section); #else long ret=ov_read(&vf,(char*)p_bufer,todo*stream_channels*sizeof(int16_t), 0, 2, 1, ¤t_section); #endif if (ret<0) { playing = false; ERR_EXPLAIN("Error reading OGG Vorbis File: "+file); ERR_BREAK(ret<0); } else if (ret==0) { // end of song, reload? ov_clear(&vf); _close_file(); if (!has_loop()) { playing=false; repeats=1; break; } f=FileAccess::open(file,FileAccess::READ); int errv = ov_open_callbacks(f,&vf,NULL,0,_ov_callbacks); if (errv!=0) { playing=false; break;; // :( } if (loop_restart_time) { bool ok = ov_time_seek(&vf,loop_restart_time)==0; if (!ok) { playing=false; //ERR_EXPLAIN("loop restart time rejected"); ERR_PRINT("loop restart time rejected") } frames_mixed=stream_srate*loop_restart_time; } else {
char set_level(matrix *p_matrix, summit *v_summit) { int i; int i_level = 0; matrix MatriceTemp; MatriceTemp.i_size = p_matrix->i_size; matrix_malloc(&MatriceTemp); if(has_loop(p_matrix)){ printf("Error : set_level. A matrix which have loop cannot be used to calculate levels"); return 0; } else{ //Initialisation matrix_copy(p_matrix, &MatriceTemp); for(i=0;i<MatriceTemp.i_size;i++){ v_summit[i].i_level = -1; } for(i=0;i<MatriceTemp.i_size;i++){ //Les sommets sans precedents sont de NV 0 if(has_prev(&MatriceTemp, i)){ v_summit[i].i_level = i_level; } } for(i=0;i<MatriceTemp.i_size;i++){ if(v_summit[i].i_level == i_level){ matrix_zero_at_line(&MatriceTemp, i); } } //Fin init while(!all_level_checked(p_matrix, v_summit)){ i_level++; for(i=0;i<MatriceTemp.i_size;i++){ if(has_prev(&MatriceTemp, i)&&(v_summit[i].i_level==-1)){ v_summit[i].i_level = i_level; } } for(i=0;i<MatriceTemp.i_size;i++){ if(v_summit[i].i_level == i_level){ matrix_zero_at_line(&MatriceTemp, i); } } //Fin for } //Fin while } //Fin si has_loop matrix_free(&MatriceTemp); return 1; }
int AudioStreamPlaybackOpus::mix(int16_t* p_bufer,int p_frames) { if (!playing) return 0; int total=p_frames; while (true) { int todo = p_frames; if (todo==0 || todo<MIN_MIX) { break; } int ret=op_read(opus_file,(opus_int16*)p_bufer,todo*stream_channels,¤t_section); if (ret<0) { playing = false; ERR_EXPLAIN("Error reading Opus File: "+file); ERR_BREAK(ret<0); } else if (ret==0) { // end of song, reload? op_free(opus_file); _close_file(); f=FileAccess::open(file,FileAccess::READ); int errv = 0; opus_file = op_open_callbacks(f,&_op_callbacks,NULL,0,&errv); if (errv!=0) { playing=false; break; // :( } if (!has_loop()) { playing=false; repeats=1; break; } if (loop_restart_time) { bool ok = op_pcm_seek(opus_file, (loop_restart_time*osrate)+pre_skip)==0; if (!ok) { playing=false; ERR_PRINT("loop restart time rejected") } frames_mixed=(loop_restart_time*osrate)+pre_skip; } else {
int main() { Insert_front(10); Insert_after(start,1); Insert_end(100); Insert_front(4); Insert_end(400); printf("Has Loop = %s\n", (PASS==has_loop())?"Yes":"No"); print_all(); start = reverse(); printf("After Reversal:\n"); print_all(); reverse_using_recurrsion(start); printf("After Reversal:\n"); print_all(); destroy_all(); }
main() { struct list *head=NULL; struct list *loop=NULL; int loop_len=0; list_append(&head,10); list_append(&head,20); list_append(&head,30); list_append(&head,40); list_append(&head,50); list_append(&head,60); list_append(&head,70); list_append(&head,80); loop= has_loop(&head); printf("Loop at %x\n",loop); loop_len=get_loop_length(loop); printf("Length of the loop=%d\n",loop_len); loop=get_merge_point(&head,loop_len); printf("Data at merge=%d\n",loop->data); print_list(&head); }
void OrientedPathFollow::_update_transform() { if (!path) return; Ref<Curve3D> c = path->get_curve(); if (!c.is_valid()) return; int count = c->get_point_count(); if (count < 2) return; if (delta_offset == 0) { return; } float offset = get_offset(); float bl = c->get_baked_length(); float bi = c->get_bake_interval(); float o = offset; float o_next = offset + bi; if (has_loop()) { o = Math::fposmod(o, bl); o_next = Math::fposmod(o_next, bl); } else if (o_next >= bl) { o = bl - bi; o_next = bl; } bool cubic = get_cubic_interpolation(); Vector3 pos = c->interpolate_baked(o, cubic); Vector3 forward = c->interpolate_baked(o_next, cubic) - pos; if (forward.length_squared() < CMP_EPSILON2) forward = Vector3(0, 0, 1); else forward.normalize(); Vector3 up = c->interpolate_baked_up_vector(o, true); if (o_next < o) { Vector3 up1 = c->interpolate_baked_up_vector(o_next, true); Vector3 axis = up.cross(up1); if (axis.length_squared() < CMP_EPSILON2) axis = forward; else axis.normalize(); up.rotate(axis, up.angle_to(up1) * 0.5f); } Transform t = get_transform(); Vector3 scale = t.basis.get_scale(); Vector3 sideways = up.cross(forward).normalized(); up = forward.cross(sideways).normalized(); t.basis.set(sideways, up, forward); t.basis.scale_local(scale); t.origin = pos + sideways * get_h_offset() + up * get_v_offset(); set_transform(t); }