Beispiel #1
0
    tuple_type(type_id_t id, size_t size, const type *element_tp, bool variadic = false,
               uint32_t flags = type_flag_none)
        : base_type(id, 0, 1, flags | type_flag_indexable | (variadic ? type_flag_symbolic : 0), 0, 0, 0),
          m_field_count(size), m_field_types(size), m_arrmeta_offsets(size), m_variadic(variadic) {
      // Calculate the needed element alignment and arrmeta offsets
      size_t arrmeta_offset = get_field_count() * sizeof(size_t);

      this->m_data_alignment = 1;

      for (intptr_t i = 0; i < m_field_count; ++i) {
        m_field_types[i] = element_tp[i];
      }

      for (intptr_t i = 0; i != m_field_count; ++i) {
        const type &ft = get_field_type(i);
        size_t field_alignment = ft.get_data_alignment();
        // Accumulate the biggest field alignment as the type alignment
        if (field_alignment > this->m_data_alignment) {
          this->m_data_alignment = (uint8_t)field_alignment;
        }
        // Inherit any operand flags from the fields
        this->flags |= (ft.get_flags() & type_flags_operand_inherited);
        // Calculate the arrmeta offsets
        m_arrmeta_offsets[i] = arrmeta_offset;
        arrmeta_offset += ft.get_arrmeta_size();
      }

      this->m_metadata_size = arrmeta_offset;
    }
/*
  =======================================================================================
  =======================================================================================
*/
bool shave_v17(HWND hDlg, int version, int line_count, int max_particles, FILE *fin, FILE *fout)
{
	char line[2048];
	int num_particles, num_to_keep, num_fields;
	int *keep_list, counter, written;
	unsigned int seed;

	memset(line, 0, sizeof(line));

	if (!fgets(line, 32, fin)) {
		MessageBox(hDlg, "Error reading field count from list file.",
			"Error", MB_OK);
		return false;
	}

	num_fields = get_field_count(line);

	if (num_fields < 10) {
		MessageBox(hDlg, "Suspiciously low field count in list file. Not processing.", "Error", MB_OK);
		return false;
	}
	
	if (num_fields + 2 >= line_count) {
		MessageBox(hDlg, "More fields then lines in file. Not processing.", "Error", MB_OK);
		return false;
	}

	num_particles = line_count - (num_fields + 2);

	num_to_keep = max_particles;

	seed = GetDlgItemInt(hDlg, IDC_RAND_SEED, NULL, FALSE);

	if (seed == 0) {
		seed = 1;
	}

	keep_list = generate_keep_list(&num_to_keep, num_particles, seed);

	if (!keep_list) {
		MessageBox(hDlg, "Internal error allocating memory.", "Error", MB_OK);
		return false;
	}

	sprintf_s(line, sizeof(line), "%03d\nnum-fields|%d\n", version, num_fields);
	
	if (fputs(line, fout) < 0) {
		MessageBox(hDlg, "Error writing output file", "Error", MB_OK);
		return false;
	}

	// write out the fields
	for (int i = 0; i < num_fields; i++) {
		if (!fgets(line, sizeof(line), fin)) {
			if (ferror(fin)) {
				MessageBox(hDlg, "Error reading input file", "Error", MB_OK);
				return false;
			}
		}

		if (fputs(line, fout) < 0) {
			MessageBox(hDlg, "Error writing output file", "Error", MB_OK);
			return false;
		}
	}

	counter = 0;
	written = 0;

	while (!feof(fin)) {
		if (!fgets(line, sizeof(line), fin)) {
			if (ferror(fin)) {
				MessageBox(hDlg, "Error reading input file", "Error", MB_OK);
				return false;
			}
		}

		if (keep_list[counter++]) {
			if (fputs(line, fout) < 0) {
				MessageBox(hDlg, "Error writing output file", "Error", MB_OK);
				return false;
			}

			if (++written >= num_to_keep) {
				break;
			}
		}
	}

	delete [] keep_list;

	return true;
}