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); }
/*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 }