static PyObject * curve_get_save(SKCurveObject * self, PyObject * args) { CurveSegment * segment; PyObject * list; int i; list = PyList_New(self->len); if (!list) return NULL; segment = self->segments; for (i = 0; i < self->len; i++, segment++) { if (!save_segment(list, i, segment)) return NULL; } return list; }
int locate_segments(int table, segment_t *segment_table, long int size_ptr, int *ptr) { int start_key, i; int segment_num; char *compress_ptr; compress_ptr = memalign(ALIGN, 2*size_ptr*sizeof(int)); for(segment_num=0; segment_num<NUM_SEGMENTS; segment_num++) { // Заполнение сегмента #ifdef USE_FILE_DB if (table == R) load_segment(segment_table[segment_num].size, ptr, R_DB); if (table == S) load_segment(segment_table[segment_num].size, ptr, S_DB); #else if(segment_num == 0) { start_key = 0; } else { start_key = start_key + segment_table[segment_num-1].size; } gen_segment(table, segment_num, segment_table[segment_num].size, ptr, start_key); #ifdef CREATE_FILE_DB if (table == R) save_segment(segment_table[segment_num].size, ptr, R_DB); if (table == S) save_segment(segment_table[segment_num].size, ptr, S_DB); #endif #endif // Вывод сегмента на печать #ifdef USE_DEBUG_PRINT printf("\t\t"); for(i=0; i<segment_table[segment_num].size; i++) printf(" (%d, %d)", ptr[db_index_key(segment_table[segment_num].size, i)], ptr[db_index_value(segment_table[segment_num].size, i)]); printf("\n"); #endif // Сжатие сегмента #ifdef USE_COMPRESS segment_table[segment_num].compress_size = size_ptr; segment_compress(ptr, 2*sizeof(int)*segment_table[segment_num].size, compress_ptr, &segment_table[segment_num].compress_size); #else segment_table[segment_num].compress_size = 2*sizeof(int)*segment_table[segment_num].size; #endif // Выделение памяти для постоянного хранения сегмента segment_table[segment_num].ptr = (char *)memalign(ALIGN, segment_table[segment_num].compress_size+1); if(segment_table[segment_num].ptr == NULL) { printf("ERROR: could not allocate memmory for %dth segment!\n", segment_num); return -1; } // Копирование сегмента в место постоянного хранения #ifdef USE_COMPRESS str_copy(compress_ptr, segment_table[segment_num].ptr, segment_table[segment_num].compress_size+1); #else str_copy(ptr, segment_table[segment_num].ptr, segment_table[segment_num].compress_size+1); #endif // Вывод сжатого сегмента на печать #ifdef USE_DEBUG_PRINT printf("\t\t segment was compressed to %ld bytes (%s)\n", segment_table[segment_num].compress_size, segment_table[segment_num].ptr); #endif } free(compress_ptr); return 0; }