int TestLinkedList(int argc, char* argv[]) { int count; int number; wLinkedList* list; list = LinkedList_New(); LinkedList_AddFirst(list, (void*) (size_t) 1); LinkedList_AddLast(list, (void*) (size_t) 2); LinkedList_AddLast(list, (void*) (size_t) 3); count = LinkedList_Count(list); if (count != 3) { printf("LinkedList_Count: expected %d, actual: %d\n", 3, count); return -1; } LinkedList_Enumerator_Reset(list); while (LinkedList_Enumerator_MoveNext(list)) { number = (int) (size_t) LinkedList_Enumerator_Current(list); printf("\t%d\n", number); } printf("\n"); printf("LinkedList First: %d Last: %d\n", (int) (size_t) LinkedList_First(list), (int) (size_t) LinkedList_Last(list)); LinkedList_RemoveFirst(list); LinkedList_RemoveLast(list); count = LinkedList_Count(list); if (count != 1) { printf("LinkedList_Count: expected %d, actual: %d\n", 1, count); return -1; } LinkedList_Enumerator_Reset(list); while (LinkedList_Enumerator_MoveNext(list)) { number = (int) (size_t) LinkedList_Enumerator_Current(list); printf("\t%d\n", number); } printf("\n"); printf("LinkedList First: %d Last: %d\n", (int) (size_t) LinkedList_First(list), (int) (size_t) LinkedList_Last(list)); LinkedList_RemoveFirst(list); LinkedList_RemoveLast(list); count = LinkedList_Count(list); if (count != 0) { printf("LinkedList_Count: expected %d, actual: %d\n", 0, count); return -1; } LinkedList_AddFirst(list, (void*) (size_t) 4); LinkedList_AddLast(list, (void*) (size_t) 5); LinkedList_AddLast(list, (void*) (size_t) 6); count = LinkedList_Count(list); if (count != 3) { printf("LinkedList_Count: expected %d, actual: %d\n", 3, count); return -1; } LinkedList_Enumerator_Reset(list); while (LinkedList_Enumerator_MoveNext(list)) { number = (int) (size_t) LinkedList_Enumerator_Current(list); printf("\t%d\n", number); } printf("\n"); printf("LinkedList First: %d Last: %d\n", (int) (size_t) LinkedList_First(list), (int) (size_t) LinkedList_Last(list)); LinkedList_Remove(list, (void*) (size_t) 5); LinkedList_Enumerator_Reset(list); while (LinkedList_Enumerator_MoveNext(list)) { number = (int) (size_t) LinkedList_Enumerator_Current(list); printf("\t%d\n", number); } printf("\n"); printf("LinkedList First: %d Last: %d\n", (int) (size_t) LinkedList_First(list), (int) (size_t) LinkedList_Last(list)); LinkedList_Free(list); /* Test enumerator robustness */ /* enumerator on an empty list */ list = LinkedList_New(); LinkedList_Enumerator_Reset(list); while (LinkedList_Enumerator_MoveNext(list)) { number = (int) (size_t) LinkedList_Enumerator_Current(list); printf("\t%d\n", number); } printf("\n"); LinkedList_Free(list); /* Use an enumerator without reset */ list = LinkedList_New(); LinkedList_AddFirst(list, (void*) (size_t) 4); LinkedList_AddLast(list, (void*) (size_t) 5); LinkedList_AddLast(list, (void*) (size_t) 6); while (LinkedList_Enumerator_MoveNext(list)) { number = (int) (size_t) LinkedList_Enumerator_Current(list); printf("\t%d\n", number); } printf("\n"); LinkedList_Free(list); return 0; }
int freerds_message_server_queue_pack(rdsBackendConnector* connector) { RDS_RECT rect; int ChainedMode; REGION16 region; wLinkedList* list; RECTANGLE_16 rect16; RDS_MSG_COMMON* node; rdsConnection* connection; const RECTANGLE_16* extents; ChainedMode = 0; connection = connector->connection; list = connector->ServerList; region16_init(®ion); LinkedList_Enumerator_Reset(list); while (LinkedList_Enumerator_MoveNext(list)) { node = (RDS_MSG_COMMON*) LinkedList_Enumerator_Current(list); if ((!ChainedMode) && (node->msgFlags & RDS_MSG_FLAG_RECT)) { rect16.left = node->rect.x; rect16.top = node->rect.y; rect16.right = node->rect.x + node->rect.width; rect16.bottom = node->rect.y + node->rect.height; region16_union_rect(®ion, ®ion, &rect16); } else { MessageQueue_Post(connector->ServerQueue, (void*) connector, node->type, (void*) node, NULL); } } LinkedList_Clear(list); if (!ChainedMode) { extents = region16_extents(®ion); rect.x = extents->left; rect.y = extents->top; rect.width = extents->right - extents->left; rect.height = extents->bottom - extents->top; freerds_message_server_align_rect(connector, &rect); if (connector->framebuffer.fbAttached && (rect.width * rect.height)) { RDS_MSG_COMMON* msg; RDS_MSG_PAINT_RECT paintRect; paintRect.type = RDS_SERVER_PAINT_RECT; paintRect.nXSrc = 0; paintRect.nYSrc = 0; paintRect.bitmapData = NULL; paintRect.bitmapDataLength = 0; paintRect.framebuffer = &(connector->framebuffer); paintRect.fbSegmentId = connector->framebuffer.fbSegmentId; paintRect.nLeftRect = rect.x; paintRect.nTopRect = rect.y; paintRect.nWidth = rect.width; paintRect.nHeight = rect.height; msg = freerds_server_message_copy((RDS_MSG_COMMON*) &paintRect); MessageQueue_Post(connector->ServerQueue, (void*) connector, msg->type, (void*) msg, NULL); } } region16_uninit(®ion); return 0; }