Пример #1
0
static st32 mprint(RMagic *ms, struct r_magic *m) {
    ut64 v;
    float vf;
    double vd;
    ut64 t = 0;
    char *buf = NULL;
    union VALUETYPE *p = &ms->ms_value;

    switch (m->type) {
    case FILE_BYTE:
        v = file_signextend(ms, m, (ut64)p->b);
        switch (check_fmt(ms, m)) {
        case -1:
            return -1;
        case 1:
            buf = malloc (2);
            if (snprintf (buf, 2, "%c", (ut8)v)<0) {
                free (buf);
                return -1;
            }
            if (file_printf (ms, R_MAGIC_DESC, buf) == -1) {
                free (buf);
                return -1;
            }
            break;
        default:
            if (file_printf(ms, R_MAGIC_DESC, (ut8) v) == -1)
                return -1;
            break;
        }
        t = ms->offset + sizeof(char);
        break;
    case FILE_SHORT:
    case FILE_BESHORT:
    case FILE_LESHORT:
        v = file_signextend (ms, m, (ut64)p->h);
        switch (check_fmt (ms, m)) {
        case -1:
            return -1;
        case 1:
            buf = malloc (32);
            if (snprintf (buf, 32, "%hu", (unsigned short)v) < 0) {
                free (buf);
                return -1;
            }
            if (file_printf(ms, R_MAGIC_DESC, buf) == -1) {
                free (buf);
                return -1;
            }
            break;
        default:
            if (file_printf(ms, R_MAGIC_DESC, (unsigned short) v) == -1)
                return -1;
            break;
        }
        t = ms->offset + sizeof(short);
        break;
    case FILE_LONG:
    case FILE_BELONG:
    case FILE_LELONG:
    case FILE_MELONG:
        v = file_signextend(ms, m, (ut64)p->l);
        switch (check_fmt(ms, m)) {
        case -1:
            return -1;
        case 1:
            buf = malloc (32);
            if (snprintf (buf, 32, "%u", (ut32)v) < 0) {
                free (buf);
                return -1;
            }
            if (file_printf(ms, R_MAGIC_DESC, buf) == -1) {
                free (buf);
                return -1;
            }
            break;
        default:
            if (file_printf(ms, R_MAGIC_DESC, (ut32) v) == -1)
                return -1;
            break;
        }
        t = ms->offset + sizeof(st32);
        break;
    case FILE_QUAD:
    case FILE_BEQUAD:
    case FILE_LEQUAD:
        v = file_signextend(ms, m, p->q);
        if (file_printf(ms, R_MAGIC_DESC, (ut64) v) == -1)
            return -1;
        t = ms->offset + sizeof(ut64);
        break;

    case FILE_STRING:
    case FILE_PSTRING:
    case FILE_BESTRING16:
    case FILE_LESTRING16:
        if (m->reln == '=' || m->reln == '!') {
            if (file_printf (ms, R_MAGIC_DESC, m->value.s) == -1)
                return -1;
            t = ms->offset + m->vallen;
        }
        else {
            if (*m->value.s == '\0')
                p->s[strcspn (p->s, "\n")] = '\0';
            if (file_printf (ms, R_MAGIC_DESC, p->s) == -1)
                return -1;
            t = ms->offset + strlen (p->s);
            if (m->type == FILE_PSTRING)
                t++;
        }
        break;
    case FILE_DATE:
    case FILE_BEDATE:
    case FILE_LEDATE:
    case FILE_MEDATE:
        if (file_printf(ms, R_MAGIC_DESC, file_fmttime(p->l, 1)) == -1)
            return -1;
        t = ms->offset + sizeof(time_t);
        break;
    case FILE_LDATE:
    case FILE_BELDATE:
    case FILE_LELDATE:
    case FILE_MELDATE:
        if (file_printf(ms, R_MAGIC_DESC, file_fmttime(p->l, 0)) == -1)
            return -1;
        t = ms->offset + sizeof(time_t);
        break;
    case FILE_QDATE:
    case FILE_BEQDATE:
    case FILE_LEQDATE:
        if (file_printf(ms, R_MAGIC_DESC, file_fmttime((ut32)p->q, 1))
                == -1)
            return -1;
        t = ms->offset + sizeof(ut64);
        break;
    case FILE_QLDATE:
    case FILE_BEQLDATE:
    case FILE_LEQLDATE:
        if (file_printf(ms, R_MAGIC_DESC, file_fmttime((ut32)p->q, 0))
                == -1)
            return -1;
        t = ms->offset + sizeof(ut64);
        break;
    case FILE_FLOAT:
    case FILE_BEFLOAT:
    case FILE_LEFLOAT:
        vf = p->f;
        switch (check_fmt(ms, m)) {
        case -1:
            return -1;
        case 1:
            buf = malloc (32);
            if (snprintf (buf, 32, "%g", vf) < 0) {
                free (buf);
                return -1;
            }
            if (file_printf (ms, R_MAGIC_DESC, buf) == -1) {
                free (buf);
                return -1;
            }
            break;
        default:
            if (file_printf(ms, R_MAGIC_DESC, vf) == -1)
                return -1;
            break;
        }
        t = ms->offset + sizeof(float);
        break;
    case FILE_DOUBLE:
    case FILE_BEDOUBLE:
    case FILE_LEDOUBLE:
        vd = p->d;
        switch (check_fmt(ms, m)) {
        case -1:
            return -1;
        case 1:
            buf = malloc (32);
            if (snprintf (buf, 32, "%g", vd) < 0) {
                free (buf);
                return -1;
            }
            if (file_printf (ms, R_MAGIC_DESC, buf) == -1) {
                free (buf);
                return -1;
            }
            break;
        default:
            if (file_printf(ms, R_MAGIC_DESC, vd) == -1)
                return -1;
            break;
        }
        t = ms->offset + sizeof(double);
        break;
    case FILE_REGEX: {
        char *cp;
        int rval;

        cp = strdupn((const char *)ms->search.s, ms->search.rm_len);
        if (cp == NULL) {
            file_oomem(ms, ms->search.rm_len);
            return -1;
        }
        rval = file_printf(ms, R_MAGIC_DESC, cp);
        free(cp);

        if (rval == -1)
            return -1;

        if ((m->str_flags & REGEX_OFFSET_START))
            t = ms->search.offset;
        else
            t = ms->search.offset + ms->search.rm_len;
        break;
    }

    case FILE_SEARCH:
        if (file_printf(ms, R_MAGIC_DESC, m->value.s) == -1)
            return -1;
        if ((m->str_flags & REGEX_OFFSET_START))
            t = ms->search.offset;
        else t = ms->search.offset + m->vallen;
        break;
    case FILE_DEFAULT:
        if (file_printf(ms, R_MAGIC_DESC, m->value.s) == -1)
            return -1;
        t = ms->offset;
        break;
    default:
        file_magerror(ms, "invalid m->type (%d) in mprint()", m->type);
        return -1;
    }
    free (buf);
    return(t);
}
Пример #2
0
/*cut the reads from the string and process them one by one*/
void read_process (bloom * bl, Queue * info, Queue * tail, F_set * File_head, float sampling_rate, float tole_rate, char mode, char fmt_type)
{
	char *start_point = info->location;
	char *next_job = NULL, *temp = NULL, *previous_point = NULL, *temp_next = NULL;
	int result = 0;
	next_job = check_fmt (info, tail, start_point, fmt_type);
	// make sure it can handle DOS and Unix format ('\r\n' and '\n')
	// XXX: what about OSX sinle '\n' ('a0' in hexa)?
	if (next_job == NULL)
		return;
	while (start_point != next_job) 
		{
		if (mode == 'c')
		{
			if (sampling_rate<1)
				temp = jump (start_point, fmt_type, sampling_rate);
			else
				temp = start_point;
		// function for fast/proportional scan
			if (start_point != temp)
			{
				start_point = temp;
				continue;
			}
		}
		// skip to the next read if needed
		#pragma omp atomic
		File_head->reads_num++;
		// atomic process for summing reads number
		previous_point = start_point;
		start_point = get_right_sp (start_point, fmt_type);
		// skip the ID line
		if (fmt_type == '@')
		{
			//identify read as fastq format read and pass it to fastq_read_check to process
			result = fastq_read_check (start_point, strchr (start_point, '\n') - start_point, 'n', bl, tole_rate, File_head);
			start_point = strchr (start_point, '\n') + 1;
			start_point = strchr (start_point, '\n') + 1;
			start_point = strchr (start_point, '\n') + 1;
		}
		else
		{
			temp_next = strchr(start_point+1,'>');
			if (temp_next == NULL)
				temp_next = next_job;
			//identify read as fasta format read and pass it to fasta_read_check to process
			result = fasta_read_check (start_point, temp_next-start_point, 'n', bl, tole_rate, File_head);
			start_point = temp_next;
		}
		if (result>0)
		{
                	 #pragma omp atomic
                         File_head->reads_contam++;
			 if (mode == 'r')
			 	{
					#pragma omp critical
					{
						memcpy(_contam,previous_point,start_point-previous_point);
						_contam+=(start_point-previous_point);
					}
				}
		}
		else
		{
			if (mode == 'r')
				{
					#pragma omp critical
					{
                                        	memcpy(_clean,previous_point,start_point-previous_point);
                                        	_clean+=(start_point-previous_point);
					}
				}
		}
	}	// outside while
}