/*! * \brief Remove a segment from a bezier. * @param bezier The bezier to remove a segment from. * @param pos The index of the segment to remove. * @returns Undo information for the segment removal. * \memberof _BezierConn */ ObjectChange * bezierconn_remove_segment (BezierConn *bezier, int pos) { Handle *old_handle1, *old_handle2, *old_handle3; ConnectionPoint *cpt1, *cpt2, *cpt3; BezPoint old_point; BezCornerType old_ctype; int next; g_assert(pos > 0); g_assert(bezier->bezier.num_points > 2); if (pos == bezier->bezier.num_points-1) pos--; next = pos+1; old_handle1 = bezier->object.handles[3*pos-2]; old_handle2 = bezier->object.handles[3*pos-1]; old_handle3 = bezier->object.handles[3*pos]; old_point = bezier->bezier.points[pos]; /* remember the old control point of following bezpoint */ old_point.p1 = bezier->bezier.points[next].p1; old_ctype = bezier->bezier.corner_types[pos]; cpt1 = old_handle1->connected_to; cpt2 = old_handle2->connected_to; cpt3 = old_handle3->connected_to; object_unconnect((DiaObject *)bezier, old_handle1); object_unconnect((DiaObject *)bezier, old_handle2); object_unconnect((DiaObject *)bezier, old_handle3); remove_handles(bezier, pos); bezierconn_update_data(bezier); return bezierconn_create_point_change(bezier, TYPE_REMOVE_POINT, &old_point, old_ctype, pos, old_handle1, cpt1, old_handle2, cpt2, old_handle3, cpt3); }
ObjectChange * beziershape_remove_segment(BezierShape *bezier, int pos) { Handle *old_handle1, *old_handle2, *old_handle3; ConnectionPoint *old_cp1, *old_cp2; BezPoint old_point; BezCornerType old_ctype; int next = pos+1; g_assert(pos > 0); g_assert(bezier->numpoints > 2); g_assert(pos < bezier->numpoints); if (pos == bezier->numpoints - 1) next = 1; old_handle1 = bezier->object.handles[3*pos-3]; old_handle2 = bezier->object.handles[3*pos-2]; old_handle3 = bezier->object.handles[3*pos-1]; old_point = bezier->points[pos]; /* remember the old contro point of following bezpoint */ old_point.p1 = bezier->points[next].p1; old_ctype = bezier->corner_types[pos]; old_cp1 = bezier->object.connections[2*pos-2]; old_cp2 = bezier->object.connections[2*pos-1]; object_unconnect((DiaObject *)bezier, old_handle1); object_unconnect((DiaObject *)bezier, old_handle2); object_unconnect((DiaObject *)bezier, old_handle3); remove_handles(bezier, pos); beziershape_update_data(bezier); return beziershape_create_point_change(bezier, TYPE_REMOVE_POINT, &old_point, old_ctype, pos, old_handle1, old_handle2, old_handle3, old_cp1, old_cp2); }
int test(char *URL) { int res = 0; CURLM *m = NULL; CURLMsg *msg; /* for picking up messages with the transfer status */ int msgs_left; /* how many messages are left */ int running; int handlenum = 0; struct timeval last_handle_add; if(parse_url_file("log/urls.txt") <= 0) goto test_cleanup; start_test_timing(); curl_global_init(CURL_GLOBAL_ALL); multi_init(m); create_handles(); multi_setopt(m, CURLMOPT_PIPELINING, 1L); multi_setopt(m, CURLMOPT_MAX_HOST_CONNECTIONS, 2L); multi_setopt(m, CURLMOPT_MAX_PIPELINE_LENGTH, 3L); multi_setopt(m, CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE, 15000L); multi_setopt(m, CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE, 10000L); multi_setopt(m, CURLMOPT_PIPELINING_SITE_BL, site_blacklist); multi_setopt(m, CURLMOPT_PIPELINING_SERVER_BL, server_blacklist); last_handle_add = tutil_tvnow(); for(;;) { struct timeval interval; struct timeval now; long int msnow, mslast; fd_set rd, wr, exc; int maxfd = -99; long timeout; interval.tv_sec = 1; interval.tv_usec = 0; if(handlenum < num_handles) { now = tutil_tvnow(); msnow = now.tv_sec * 1000 + now.tv_usec / 1000; mslast = last_handle_add.tv_sec * 1000 + last_handle_add.tv_usec / 1000; if(msnow - mslast >= urltime[handlenum] && handlenum < num_handles) { fprintf(stdout, "Adding handle %d\n", handlenum); setup_handle(URL, m, handlenum); last_handle_add = now; handlenum++; } } curl_multi_perform(m, &running); abort_on_test_timeout(); /* See how the transfers went */ while ((msg = curl_multi_info_read(m, &msgs_left))) { if (msg->msg == CURLMSG_DONE) { int i, found = 0; /* Find out which handle this message is about */ for (i = 0; i < num_handles; i++) { found = (msg->easy_handle == handles[i]); if(found) break; } printf("Handle %d Completed with status %d\n", i, msg->data.result); curl_multi_remove_handle(m, handles[i]); } } if(handlenum == num_handles && !running) { break; /* done */ } FD_ZERO(&rd); FD_ZERO(&wr); FD_ZERO(&exc); curl_multi_fdset(m, &rd, &wr, &exc, &maxfd); /* At this point, maxfd is guaranteed to be greater or equal than -1. */ curl_multi_timeout(m, &timeout); if(timeout < 0) timeout = 1; interval.tv_sec = timeout / 1000; interval.tv_usec = (timeout % 1000) * 1000; interval.tv_sec = 0; interval.tv_usec = 1000; select_test(maxfd+1, &rd, &wr, &exc, &interval); abort_on_test_timeout(); } test_cleanup: remove_handles(); /* undocumented cleanup sequence - type UB */ curl_multi_cleanup(m); curl_global_cleanup(); free_urls(); return res; }