コード例 #1
0
bool element_block_func_base::equal_block(const base_element_block& left, const base_element_block& right)
{
    element_t block_type = get_block_type(left);
    if (block_type != get_block_type(right))
        return false;

    switch (block_type)
    {
        case element_type_numeric:
            return numeric_element_block::get(left) == numeric_element_block::get(right);
        case element_type_string:
            return string_element_block::get(left) == string_element_block::get(right);
        case element_type_short:
            return short_element_block::get(left) == short_element_block::get(right);
        case element_type_ushort:
            return ushort_element_block::get(left) == ushort_element_block::get(right);
        case element_type_int:
            return int_element_block::get(left) == int_element_block::get(right);
        case element_type_uint:
            return uint_element_block::get(left) == uint_element_block::get(right);
        case element_type_long:
            return long_element_block::get(left) == long_element_block::get(right);
        case element_type_ulong:
            return ulong_element_block::get(left) == ulong_element_block::get(right);
        case element_type_boolean:
            return boolean_element_block::get(left) == boolean_element_block::get(right);
        case element_type_char:
            return char_element_block::get(left) == char_element_block::get(right);
        case element_type_uchar:
            return uchar_element_block::get(left) == uchar_element_block::get(right);
        default:
            ;
    }
    return false;
}
コード例 #2
0
ファイル: csv_selector_io.cpp プロジェクト: chkhm/qcsv
//virtual
std::istream &csv_selector::input(std::istream &iss) {
    // reuse the input from csv_tool
    if (!iss) {
        return iss;
    }
    csv_data->buffer.clear();
    while (iss) {
        std::string tmp = read_block(iss);
        // std::cerr << "tmp:" << std::endl << tmp << std::endl;
        if (tmp.size() < 1) {
            break;
        }
        
        std::string block_type = get_block_type(tmp);
        if (block_type == "csv_analyzer_header") {
            csv_data->mcolumns = parse_csv_header(tmp);
            this->update_selector();
        } else if (block_type == "line_t" ) {
            line_t line = parse_csv_line(tmp);
            csv_data->buffer.push_back(line);
        } else {
            throw std::runtime_error("unknown block type in csv_selector::input: \"" + block_type + "\". block = \"" + tmp + "\".");
        }
    }
    return iss;
}
コード例 #3
0
base_element_block* element_block_func_base::clone_block(const base_element_block& block)
{
    switch (get_block_type(block))
    {
        case element_type_numeric:
            return numeric_element_block::clone_block(block);
        case element_type_string:
            return string_element_block::clone_block(block);
        case element_type_short:
            return short_element_block::clone_block(block);
        case element_type_ushort:
            return ushort_element_block::clone_block(block);
        case element_type_int:
            return int_element_block::clone_block(block);
        case element_type_uint:
            return uint_element_block::clone_block(block);
        case element_type_long:
            return long_element_block::clone_block(block);
        case element_type_ulong:
            return ulong_element_block::clone_block(block);
        case element_type_boolean:
            return boolean_element_block::clone_block(block);
        case element_type_char:
            return char_element_block::clone_block(block);
        case element_type_uchar:
            return uchar_element_block::clone_block(block);
        default:
            throw general_error("clone_block: failed to clone a block of unknown type.");
    }
}
コード例 #4
0
ファイル: realloc.c プロジェクト: acazuc/42_malloc
void		*realloc_small_tiny(t_page_list *lst, void *ptr, size_t len)
{
	size_t	i;
	void	*addr;

	if (len <= get_block_size(lst->page.type))
	{
		MALLOC_UNLOCK();
		return (return_enomem(ptr));
	}
	if (!(addr = create_new_block(get_block_type(len), len)))
	{
		MALLOC_UNLOCK();
		return (return_enomem(NULL));
	}
	i = 0;
	while (i < len && i < lst->page.len - sizeof(*lst))
	{
		((unsigned char*)addr)[i] = ((unsigned char*)ptr)[i];
		i++;
	}
	free(ptr);
	MALLOC_UNLOCK();
	return (return_enomem(addr));
}
コード例 #5
0
ファイル: gadgetwritehdf.cpp プロジェクト: sbird/GadgetReader
 int64_t GWriteHDFFile::WriteBlock(std::string BlockName, int type, void *data, int partlen, uint32_t np_write, uint32_t begin)
 {
           herr_t herr;
           hid_t handle = H5Fopen(filename.c_str(), H5F_ACC_RDWR, H5P_DEFAULT);
           hid_t group = H5Gopen2(handle, g_name[type], H5P_DEFAULT);
           if(group < 0)
               return group;
           hsize_t size[2];
           int rank=1;
           //Get type
           char b_type = get_block_type(BlockName);
           hid_t dtype;
           if(b_type == 'f') {
               size[1] = partlen/sizeof(float);
               dtype=H5T_NATIVE_FLOAT;
           }else if (b_type == 'i') {
               size[1] = partlen/sizeof(int64_t);
               //Hopefully this is 64 bits; the HDF5 manual is not clear.
               dtype = H5T_NATIVE_LLONG;
           }
           else{
               return -1000;
           }
           if (size[1] > 1) {
                   rank = 2;
           }
           /* I don't totally understand why the below works (it is not clear to me from the documentation).
            * I gleaned it from a posting to the HDF5 mailing list and a related stack overflow thread here:
            * http://stackoverflow.com/questions/24883461/hdf5-updating-a-cell-in-a-table-of-integers
            * http://lists.hdfgroup.org/pipermail/hdf-forum_lists.hdfgroup.org/2014-July/007966.html
            * The important thing seems to be that we have a dataspace for the whole array and create a hyperslab on that dataspace.
            * Then we need another dataspace with the size of the stuff we want to write.*/
           //Make space in memory for the whole array
           //Create a hyperslab that we will write to
           size[0] = npart[type];
           hid_t full_space_id = H5Screate_simple(rank, size, NULL);
           //If this is the first write, create the dataset
           if (begin==0) {
               H5Dcreate2(group,BlockName.c_str(),dtype, full_space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
           }
           hid_t dset = H5Dopen2(group,BlockName.c_str(),H5P_DEFAULT);
           if (dset < 0)
               return dset;
           size[0] = np_write;
           hid_t space_id = H5Screate_simple(rank, size, NULL);
           hsize_t begins[2]={begin,0};
           //Select the hyperslab of elements we are about to write to
           H5Sselect_hyperslab(full_space_id, H5S_SELECT_SET, begins, NULL, size, NULL);
           /* Write to the dataset */
           herr = H5Dwrite(dset, dtype, space_id, full_space_id, H5P_DEFAULT, data);
           H5Dclose(dset);
           H5Sclose(space_id);
           H5Sclose(full_space_id);
           H5Gclose(group);
           H5Fclose(handle);
           if (herr < 0)
               return herr;
           return np_write;
 }
コード例 #6
0
void element_block_func_base::swap_values(
    base_element_block& blk1, base_element_block& blk2, size_t pos1, size_t pos2, size_t len)
{
    element_t blk1_type = get_block_type(blk1);
    assert(blk1_type == get_block_type(blk2));
    switch (blk1_type)
    {
        case element_type_numeric:
            numeric_element_block::swap_values(blk1, blk2, pos1, pos2, len);
        break;
        case element_type_string:
            string_element_block::swap_values(blk1, blk2, pos1, pos2, len);
        break;
        case element_type_short:
            short_element_block::swap_values(blk1, blk2, pos1, pos2, len);
        break;
        case element_type_ushort:
            ushort_element_block::swap_values(blk1, blk2, pos1, pos2, len);
        break;
        case element_type_int:
            int_element_block::swap_values(blk1, blk2, pos1, pos2, len);
        break;
        case element_type_uint:
            uint_element_block::swap_values(blk1, blk2, pos1, pos2, len);
        break;
        case element_type_long:
            long_element_block::swap_values(blk1, blk2, pos1, pos2, len);
        break;
        case element_type_ulong:
            ulong_element_block::swap_values(blk1, blk2, pos1, pos2, len);
        break;
        case element_type_boolean:
            boolean_element_block::swap_values(blk1, blk2, pos1, pos2, len);
        break;
        case element_type_char:
            char_element_block::swap_values(blk1, blk2, pos1, pos2, len);
        break;
        case element_type_uchar:
            uchar_element_block::swap_values(blk1, blk2, pos1, pos2, len);
        break;
        default:
            throw general_error("swap_values: block of unknown type.");
    }
}
コード例 #7
0
ファイル: world.cpp プロジェクト: developerbmw/cubed
BlockType World::get_block_type(int block_x, int block_y, int block_z) const
{
	auto chunk = get_block_chunk(block_x, block_y, block_z);

	if (!chunk)
	{
		return BLOCK_AIR;
	}

	return chunk->get_block_type(static_cast<int>(block_x - chunk->get_x() * WorldConstants::CHUNK_SIZE), static_cast<int>(block_y - chunk->get_y() * WorldConstants::CHUNK_SIZE), static_cast<int>(block_z - chunk->get_z() * WorldConstants::CHUNK_SIZE));
}
コード例 #8
0
ファイル: cube2.c プロジェクト: yonghuhaige/cube
static int init_face(cube_face_t *face, char color){
  int i;
  int j;

  for(i = 0; i < CUBE_ORDER; ++i){
    for(j = 0; j < CUBE_ORDER; ++j){
      face->block[i][j].color = color;
      face->block[i][j].row = 'A' + i;
      face->block[i][j].col = 'a' + j;
      face->block[i][j].type = get_block_type(i, j);
    }
  }
  return 0;
}
コード例 #9
0
void element_block_func_base::delete_block(const base_element_block* p)
{
    if (!p)
        return;

    switch (get_block_type(*p))
    {
        case element_type_numeric:
            numeric_element_block::delete_block(p);
        break;
        case element_type_string:
            string_element_block::delete_block(p);
        break;
        case element_type_short:
            short_element_block::delete_block(p);
        break;
        case element_type_ushort:
            ushort_element_block::delete_block(p);
        break;
        case element_type_int:
            int_element_block::delete_block(p);
        break;
        case element_type_uint:
            uint_element_block::delete_block(p);
        break;
        case element_type_long:
            long_element_block::delete_block(p);
        break;
        case element_type_ulong:
            ulong_element_block::delete_block(p);
        break;
        case element_type_boolean:
            boolean_element_block::delete_block(p);
        break;
        case element_type_char:
            char_element_block::delete_block(p);
        break;
        case element_type_uchar:
            uchar_element_block::delete_block(p);
        break;
        default:
            throw general_error("delete_block: failed to delete a block of unknown type.");
    }
}
コード例 #10
0
void element_block_func_base::prepend_values_from_block(
    base_element_block& dest, const base_element_block& src, size_t begin_pos, size_t len)
{
    switch (get_block_type(dest))
    {
        case element_type_numeric:
            numeric_element_block::prepend_values_from_block(dest, src, begin_pos, len);
        break;
        case element_type_string:
            string_element_block::prepend_values_from_block(dest, src, begin_pos, len);
        break;
        case element_type_short:
            short_element_block::prepend_values_from_block(dest, src, begin_pos, len);
        break;
        case element_type_ushort:
            ushort_element_block::prepend_values_from_block(dest, src, begin_pos, len);
        break;
        case element_type_int:
            int_element_block::prepend_values_from_block(dest, src, begin_pos, len);
        break;
        case element_type_uint:
            uint_element_block::prepend_values_from_block(dest, src, begin_pos, len);
        break;
        case element_type_long:
            long_element_block::prepend_values_from_block(dest, src, begin_pos, len);
        break;
        case element_type_ulong:
            ulong_element_block::prepend_values_from_block(dest, src, begin_pos, len);
        break;
        case element_type_boolean:
            boolean_element_block::prepend_values_from_block(dest, src, begin_pos, len);
        break;
        case element_type_char:
            char_element_block::prepend_values_from_block(dest, src, begin_pos, len);
        break;
        case element_type_uchar:
            uchar_element_block::prepend_values_from_block(dest, src, begin_pos, len);
        break;
        default:
            throw general_error("prepend_values_from_block: failed to prepend values to a block of unknown type.");
    }
}
コード例 #11
0
void element_block_func_base::shrink_to_fit(base_element_block& block)
{
    switch (get_block_type(block))
    {
        case element_type_numeric:
            numeric_element_block::shrink_to_fit(block);
        break;
        case element_type_string:
            string_element_block::shrink_to_fit(block);
        break;
        case element_type_short:
            short_element_block::shrink_to_fit(block);
        break;
        case element_type_ushort:
            ushort_element_block::shrink_to_fit(block);
        break;
        case element_type_int:
            int_element_block::shrink_to_fit(block);
        break;
        case element_type_uint:
            uint_element_block::shrink_to_fit(block);
        break;
        case element_type_long:
            long_element_block::shrink_to_fit(block);
        break;
        case element_type_ulong:
            ulong_element_block::shrink_to_fit(block);
        break;
        case element_type_boolean:
            boolean_element_block::shrink_to_fit(block);
        break;
        case element_type_char:
            char_element_block::shrink_to_fit(block);
        break;
        case element_type_uchar:
            uchar_element_block::shrink_to_fit(block);
        break;
        default:
            throw general_error("shrink_to_fit: failed to print a block of unknown type.");
    }
}
コード例 #12
0
void element_block_func_base::erase(base_element_block& block, size_t pos, size_t size)
{
    switch (get_block_type(block))
    {
        case element_type_numeric:
            numeric_element_block::erase_block(block, pos, size);
        break;
        case element_type_string:
            string_element_block::erase_block(block, pos, size);
        break;
        case element_type_short:
            short_element_block::erase_block(block, pos, size);
        break;
        case element_type_ushort:
            ushort_element_block::erase_block(block, pos, size);
        break;
        case element_type_int:
            int_element_block::erase_block(block, pos, size);
        break;
        case element_type_uint:
            uint_element_block::erase_block(block, pos, size);
        break;
        case element_type_long:
            long_element_block::erase_block(block, pos, size);
        break;
        case element_type_ulong:
            ulong_element_block::erase_block(block, pos, size);
        break;
        case element_type_boolean:
            boolean_element_block::erase_block(block, pos, size);
        break;
        case element_type_char:
            char_element_block::erase_block(block, pos, size);
        break;
        case element_type_uchar:
            uchar_element_block::erase_block(block, pos, size);
        break;
        default:
            throw general_error("erase: failed to erase elements from a block of unknown type.");
    }
}
コード例 #13
0
ファイル: journal.c プロジェクト: BetaXOi/gfs2-utils
static int is_wrap_pt(char *buf, uint64_t *highest_seq)
{
	struct gfs2_buffer_head tbh = { .b_data = buf };

	if (get_block_type(&tbh, NULL) == GFS2_METATYPE_LH) {
		uint64_t seq;

		if (sbd.gfs1) {
			struct gfs_log_header lh;
			gfs_log_header_in(&lh, &tbh);
			seq = lh.lh_sequence;
		} else {
			struct gfs2_log_header lh;
			gfs2_log_header_in(&lh, &tbh);
			seq = lh.lh_sequence;
		}
		if (seq < *highest_seq)
			return 1;
		*highest_seq = seq;
	}
	return 0;
}
コード例 #14
0
ファイル: journal.c プロジェクト: BetaXOi/gfs2-utils
/**
 * meta_has_ref - check if a metadata block references a given block
 */
static int meta_has_ref(uint64_t abs_block, int tblk)
{
	struct gfs2_buffer_head *mbh;
	int structlen, ty, has_ref = 0;
	uint64_t *b;
	struct gfs2_dinode *dinode;

	mbh = bread(&sbd, abs_block);
	ty = get_block_type(mbh, &structlen);
	if (ty == GFS2_METATYPE_DI) {
		dinode = (struct gfs2_dinode *)mbh->b_data;
		if (be64_to_cpu(dinode->di_eattr) == tblk)
			has_ref = 1;
	}
	b = (uint64_t *)(mbh->b_data + structlen);
	while (!has_ref && ty && (char *)b < mbh->b_data + sbd.bsize) {
		if (be64_to_cpu(*b) == tblk)
			has_ref = 1;
		b++;
	}
	brelse(mbh);
	return has_ref;
}
コード例 #15
0
ファイル: parser.cpp プロジェクト: toneill818/beaker
Type const*
Parser::on_block_type(Type const* t)
{
  return get_block_type(t);
}
コード例 #16
0
ファイル: journal.c プロジェクト: BetaXOi/gfs2-utils
/**
 * dump_journal - dump a journal file's contents.
 * @journal: name of the journal to dump
 * @tblk: block number to trace in the journals
 *
 * This function dumps the contents of a journal. If a trace block is specified
 * then only information printed is: (1) log descriptors that reference that
 * block, (2) metadata in the journal that references the block, or (3)
 * rgrp bitmaps that reference that block's allocation bit status.
 */
void dump_journal(const char *journal, int tblk)
{
	struct gfs2_buffer_head *j_bh = NULL, dummy_bh;
	uint64_t jblock, j_size, jb, abs_block, saveblk, wrappt = 0;
	int start_line, journal_num;
	struct gfs2_inode *j_inode = NULL;
	int ld_blocks = 0, offset_from_ld = 0;
	uint64_t tblk_off = 0, bblk_off = 0, bitblk = 0;
	uint64_t highest_seq = 0;
	char *jbuf = NULL;
	struct rgrp_tree *rgd = NULL;
	uint64_t abs_ld = 0;

	start_line = line;
	lines_per_row[dmode] = 1;
	journal_num = atoi(journal + 7);
	print_gfs2("Dumping journal #%d.", journal_num);
	if (tblk) {
		dmode = HEX_MODE;
		print_gfs2(" Tracing block 0x%llx", (unsigned long long)tblk);
	}
	eol(0);
	jblock = find_journal_block(journal, &j_size);
	if (!jblock)
		return;

	if (!sbd.gfs1) {
		j_bh = bread(&sbd, jblock);
		j_inode = lgfs2_inode_get(&sbd, j_bh);
		if (j_inode == NULL) {
			fprintf(stderr, "Out of memory\n");
			exit(-1);
		}
		jbuf = malloc(sbd.bsize);
		if (jbuf == NULL) {
			fprintf(stderr, "Out of memory\n");
			exit(-1);
		}
	}

	if (tblk) {
		uint64_t wp;

		rgd = gfs2_blk2rgrpd(&sbd, tblk);
		if (!rgd) {
			print_gfs2("Can't locate the rgrp for block 0x%x",
				   tblk);
			eol(0);
		} else {
			uint64_t o;
			int bmap = 0;

			print_gfs2("rgd: 0x%llx for 0x%x, ", rgd->ri.ri_addr,
				   rgd->ri.ri_length);
			o = tblk - rgd->ri.ri_data0;
			if (o >= (rgd->bits->bi_start +
				  rgd->bits->bi_len) * GFS2_NBBY)
				o += (sizeof(struct gfs2_rgrp) -
				      sizeof(struct gfs2_meta_header))
					* GFS2_NBBY;
			bmap = o / sbd.sd_blocks_per_bitmap;
			bitblk = rgd->ri.ri_addr + bmap;
			print_gfs2("bitmap: %d, bitblk: 0x%llx", bmap,
				   (unsigned long long)bitblk);
			eol(0);
		}

		wrappt = find_wrap_pt(j_inode, jbuf, jblock, j_size);
		wp = wrappt / (sbd.gfs1 ? 1 : sbd.bsize);
		print_gfs2("Starting at journal wrap block: 0x%llx "
			   "(j + 0x%llx)",
			   (unsigned long long)jblock + wp,
			   (unsigned long long)wp);
		eol(0);
	}

	for (jb = 0; jb < j_size; jb += (sbd.gfs1 ? 1 : sbd.bsize)) {
		int is_pertinent = 1;
		uint32_t block_type = 0;

		if (sbd.gfs1) {
			if (j_bh)
				brelse(j_bh);
			abs_block = jblock + ((jb + wrappt) % j_size);
			j_bh = bread(&sbd, abs_block);
			dummy_bh.b_data = j_bh->b_data;
		} else {
			int error = fsck_readi(j_inode, (void *)jbuf,
					   ((jb + wrappt) % j_size),
					   sbd.bsize, &abs_block);
			if (!error) /* end of file */
				break;
			dummy_bh.b_data = jbuf;
		}
		offset_from_ld++;
		block_type = get_block_type(&dummy_bh, NULL);
		if (block_type == GFS2_METATYPE_LD) {
			ld_blocks = process_ld(abs_block, wrappt, j_size, jb,
					       &dummy_bh, tblk, &tblk_off,
					       bitblk, rgd, &is_pertinent,
					       &bblk_off);
			offset_from_ld = 0;
			abs_ld = abs_block;
		} else if (!tblk && block_type == GFS2_METATYPE_LH) {
			struct gfs2_log_header lh;
			struct gfs_log_header lh1;

			if (sbd.gfs1) {
				gfs_log_header_in(&lh1, &dummy_bh);
				check_journal_wrap(lh1.lh_sequence,
						   &highest_seq);
				print_gfs2("0x%"PRIx64" (j+%4"PRIx64"): Log header: "
					   "Flags:%x, Seq: 0x%llx, 1st: 0x%llx, "
					   "tail: 0x%llx, last: 0x%llx",
					   abs_block, jb + wrappt,
					   lh1.lh_flags, lh1.lh_sequence,
					   lh1.lh_first, lh1.lh_tail,
					   lh1.lh_last_dump);
			} else {
				gfs2_log_header_in(&lh, &dummy_bh);
				check_journal_wrap(lh.lh_sequence,
						   &highest_seq);
				print_gfs2("0x%"PRIx64" (j+%4"PRIx64"): Log header: Seq"
					   ": 0x%llx, tail: 0x%x, blk: 0x%x%s",
					   abs_block, ((jb + wrappt) % j_size)
					   / sbd.bsize, lh.lh_sequence,
					   lh.lh_tail, lh.lh_blkno,
					   lh.lh_flags ==
					   GFS2_LOG_HEAD_UNMOUNT ?
					   " [UNMOUNTED]" : "");
			}
			eol(0);
		} else if ((ld_blocks > 0) &&
			   (sbd.gfs1 || block_type == GFS2_METATYPE_LB)) {
			print_gfs2("0x%"PRIx64" (j+%4"PRIx64"): Log descriptor"
				   " continuation block", abs_block,
				   ((jb + wrappt) % j_size) / sbd.bsize);
			eol(0);
			print_gfs2("                    ");
			ld_blocks -= print_ld_blks((uint64_t *)dummy_bh.b_data +
						   (sbd.gfs1 ? 0 :
						    sizeof(struct gfs2_meta_header)),
						   (dummy_bh.b_data +
						    sbd.bsize), start_line,
						   tblk, &tblk_off, 0, rgd,
						   0, 1, NULL, 0);
		} else if (block_type == 0) {
			continue;
		}
		/* Check if this metadata block references the block we're
		   trying to trace. */
		if (details || (tblk && ((is_pertinent &&
		     ((tblk_off && offset_from_ld == tblk_off) ||
		      (bblk_off && offset_from_ld == bblk_off))) ||
		     meta_has_ref(abs_block, tblk)))) {
			uint64_t ref_blk = 0;

			saveblk = block;
			block = abs_block;
			if (tblk && !details) {
				ref_blk = get_ldref(abs_ld, offset_from_ld);
				display(0, 1, tblk, ref_blk);
			} else {
				display(0, 0, 0, 0);
			}
			block = saveblk;
		}
	}
	inode_put(&j_inode);
	brelse(j_bh);
	blockhist = -1; /* So we don't print anything else */
	free(jbuf);
	if (!termlines)
		fflush(stdout);
}