void SamBam_read_ref_info(SamBam_FILE * ret) { unsigned int ref_info_size = 0; ret ->bam_chro_table_size = 0; //printf("CKK0\n"); SB_FETCH(ret); if(SB_EOF(ret)) return; //printf("CKK1\n"); memcpy(&ref_info_size, SB_READ(ret),4); SB_RINC(ret, 4); int xk1; ret -> bam_chro_table = malloc(sizeof(SamBam_Reference_Info) * ref_info_size); for(xk1=0;xk1<ref_info_size;xk1++) { SB_FETCH(ret); if(SB_EOF(ret)) break; int ref_name_len = 0; memcpy(&ref_name_len, SB_READ(ret),4); SB_RINC(ret, 4); int ref_readin_len = min(ref_name_len, BAM_MAX_CHROMOSOME_NAME_LEN-1); int ref_skip_len = ref_name_len - ref_readin_len; memcpy(ret -> bam_chro_table[xk1].chro_name, SB_READ(ret), ref_readin_len); ret -> bam_chro_table[xk1].chro_name[ref_readin_len] = 0; SB_RINC(ret, ref_readin_len + ref_skip_len); memcpy(&(ret -> bam_chro_table[xk1].chro_length), SB_READ(ret),4); SB_RINC(ret, 4); //SUBREADprintf("CHRO[%d] : %s [%d]\n", xk1+1, ret -> bam_chro_table[xk1].chro_name , ret -> bam_chro_table[xk1].chro_length); } ret ->bam_chro_table_size = ref_info_size; }
static void suboption(void) { unsigned char subchar; printsub('<', subbuffer, SB_LEN()+2); switch (subchar = SB_GET()) { case TELOPT_TTYPE: if (my_want_state_is_wont(TELOPT_TTYPE)) return; if (SB_EOF() || SB_GET() != TELQUAL_SEND) { return; } else { const char *name; unsigned char temp[50]; int len; name = gettermname(); len = strlen(name) + 4 + 2; if (len < NETROOM()) { sprintf(temp, "%c%c%c%c%s%c%c", IAC, SB, TELOPT_TTYPE, TELQUAL_IS, name, IAC, SE); ring_supply_data(&netoring, temp, len); printsub('>', &temp[2], len-2); } else { ExitString("No room in buffer for terminal type.\n", 1); /*NOTREACHED*/ } } break; case TELOPT_TSPEED: if (my_want_state_is_wont(TELOPT_TSPEED)) return; if (SB_EOF()) return; if (SB_GET() == TELQUAL_SEND) { long ospeed, ispeed; unsigned char temp[50]; int len; TerminalSpeeds(&ispeed, &ospeed); sprintf((char *)temp, "%c%c%c%c%ld,%ld%c%c", IAC, SB, TELOPT_TSPEED, TELQUAL_IS, ospeed, ispeed, IAC, SE); len = strlen((char *)temp+4) + 4; /* temp[3] is 0 ... */ if (len < NETROOM()) { ring_supply_data(&netoring, temp, len); printsub('>', temp+2, len - 2); } /*@*/ else printf("lm_will: not enough room in buffer\n"); } break; case TELOPT_LFLOW: if (my_want_state_is_wont(TELOPT_LFLOW)) return; if (SB_EOF()) return; switch(SB_GET()) { case LFLOW_RESTART_ANY: restartany = 1; break; case LFLOW_RESTART_XON: restartany = 0; break; case LFLOW_ON: localflow = 1; break; case LFLOW_OFF: localflow = 0; break; default: return; } setcommandmode(); setconnmode(0); break; case TELOPT_LINEMODE: if (my_want_state_is_wont(TELOPT_LINEMODE)) return; if (SB_EOF()) return; switch (SB_GET()) { case WILL: lm_will(subpointer, SB_LEN()); break; case WONT: lm_wont(subpointer, SB_LEN()); break; case DO: lm_do(subpointer, SB_LEN()); break; case DONT: lm_dont(subpointer, SB_LEN()); break; case LM_SLC: slc(subpointer, SB_LEN()); break; case LM_MODE: lm_mode(subpointer, SB_LEN(), 0); break; default: break; } break; #ifdef OLD_ENVIRON case TELOPT_OLD_ENVIRON: #endif case TELOPT_NEW_ENVIRON: if (SB_EOF()) return; switch(SB_PEEK()) { case TELQUAL_IS: case TELQUAL_INFO: if (my_want_state_is_dont(subchar)) return; break; case TELQUAL_SEND: if (my_want_state_is_wont(subchar)) { return; } break; default: return; } env_opt(subpointer, SB_LEN()); break; case TELOPT_XDISPLOC: if (my_want_state_is_wont(TELOPT_XDISPLOC)) return; if (SB_EOF()) return; if (SB_GET() == TELQUAL_SEND) { unsigned char temp[50], *dp; int len; if ((dp = env_getvalue("DISPLAY")) == NULL || strlen(dp) > sizeof(temp) - 7) { /* * Something happened, we no longer have a DISPLAY * variable. Or it is too long. So, turn off the option. */ send_wont(TELOPT_XDISPLOC, 1); break; } snprintf(temp, sizeof(temp), "%c%c%c%c%s%c%c", IAC, SB, TELOPT_XDISPLOC, TELQUAL_IS, dp, IAC, SE); len = strlen((char *)temp+4) + 4; /* temp[3] is 0 ... */ if (len < NETROOM()) { ring_supply_data(&netoring, temp, len); printsub('>', temp+2, len - 2); } /*@*/ else printf("lm_will: not enough room in buffer\n"); } break; #ifdef AUTHENTICATION case TELOPT_AUTHENTICATION: { if (!autologin) break; if (SB_EOF()) return; switch(SB_GET()) { case TELQUAL_IS: if (my_want_state_is_dont(TELOPT_AUTHENTICATION)) return; auth_is(subpointer, SB_LEN()); break; case TELQUAL_SEND: if (my_want_state_is_wont(TELOPT_AUTHENTICATION)) return; auth_send(subpointer, SB_LEN()); break; case TELQUAL_REPLY: if (my_want_state_is_wont(TELOPT_AUTHENTICATION)) return; auth_reply(subpointer, SB_LEN()); break; case TELQUAL_NAME: if (my_want_state_is_dont(TELOPT_AUTHENTICATION)) return; auth_name(subpointer, SB_LEN()); break; } } break; #endif #ifdef ENCRYPTION case TELOPT_ENCRYPT: if (SB_EOF()) return; switch(SB_GET()) { case ENCRYPT_START: if (my_want_state_is_dont(TELOPT_ENCRYPT)) return; encrypt_start(subpointer, SB_LEN()); break; case ENCRYPT_END: if (my_want_state_is_dont(TELOPT_ENCRYPT)) return; encrypt_end(); break; case ENCRYPT_SUPPORT: if (my_want_state_is_wont(TELOPT_ENCRYPT)) return; encrypt_support(subpointer, SB_LEN()); break; case ENCRYPT_REQSTART: if (my_want_state_is_wont(TELOPT_ENCRYPT)) return; encrypt_request_start(subpointer, SB_LEN()); break; case ENCRYPT_REQEND: if (my_want_state_is_wont(TELOPT_ENCRYPT)) return; /* * We can always send an REQEND so that we cannot * get stuck encrypting. We should only get this * if we have been able to get in the correct mode * anyhow. */ encrypt_request_end(); break; case ENCRYPT_IS: if (my_want_state_is_dont(TELOPT_ENCRYPT)) return; encrypt_is(subpointer, SB_LEN()); break; case ENCRYPT_REPLY: if (my_want_state_is_wont(TELOPT_ENCRYPT)) return; encrypt_reply(subpointer, SB_LEN()); break; case ENCRYPT_ENC_KEYID: if (my_want_state_is_dont(TELOPT_ENCRYPT)) return; encrypt_enc_keyid(subpointer, SB_LEN()); break; case ENCRYPT_DEC_KEYID: if (my_want_state_is_wont(TELOPT_ENCRYPT)) return; encrypt_dec_keyid(subpointer, SB_LEN()); break; default: break; } break; #endif /* ENCRYPTION */ default: break; } }
SamBam_FILE * SamBam_fopen(char * fname , int file_type) { SamBam_FILE * ret = (SamBam_FILE *)malloc(sizeof(SamBam_FILE)); ret -> file_type = file_type; if(file_type ==SAMBAM_FILE_SAM) { ret -> os_file = f_subr_open(fname, "rb"); if(!ret -> os_file) { free(ret); return NULL; } fseek(ret -> os_file,0,SEEK_SET); } else { ret -> os_file = f_subr_open(fname, "rb"); if(ret -> os_file == NULL) { free(ret); return NULL; } unsigned char first_ch = fgetc(ret->os_file); unsigned char second_ch = fgetc(ret->os_file); if(first_ch!=31 || second_ch!=139) { free(ret); return NULL; } fseek(ret->os_file, 0, SEEK_SET); ret -> input_binary_stream_buffer = (char *)malloc(SAMBAM_INPUT_STREAM_SIZE); ret -> input_binary_stream_read_ptr = 0; ret -> input_binary_stream_write_ptr = 0; ret -> input_binary_stream_buffer_start_ptr = 0; ret -> bam_file_stage = BAM_FILE_STAGE_HEADER; ret -> is_eof = 0; SB_FETCH(ret); if(SB_EOF(ret)) { free(ret->input_binary_stream_buffer); free(ret); SUBREADprintf("FEOF 0!\n"); return NULL; } int magic_4 = 0; memcpy(&magic_4 , SB_READ(ret), 4); SB_RINC(ret, 4); if(magic_4 != 21840194) // this number is the four bytes of "BAM1" { free(ret->input_binary_stream_buffer); free(ret); SUBREADprintf("FEOF 4 == %d!\n", magic_4); return NULL; } int l_text = 0; memcpy(&l_text, SB_READ(ret), 4); SB_RINC(ret, 4); ret -> bam_file_next_section_start = ret -> input_binary_stream_read_ptr + l_text; } return ret; }
char * SamBam_fgets(SamBam_FILE * fp, char * buff , int buff_len, int seq_needed) { if(fp->file_type==SAMBAM_FILE_SAM){ char * ret = fgets(buff, buff_len, fp->os_file); int strlenbuff = strlen(buff); if(strlenbuff < 1 || ret == NULL) return NULL; else{ if(ret[strlenbuff-1]!='\n') { while(1) { int ch = getc(fp->os_file); if(ch == EOF || ch == '\n')break; } ret[strlenbuff-1] = '\n'; } return ret; } } else { int xk1; // decrypt the BAM mess. if(fp-> bam_file_stage == BAM_FILE_STAGE_HEADER) { char nch; xk1=0; SB_FETCH(fp); if(SB_EOF(fp)) return NULL; while(1) { if(fp -> input_binary_stream_read_ptr >= fp -> bam_file_next_section_start) break; nch = *(SB_READ(fp)); SB_RINC(fp,1); //printf("NNCH=%c\n", nch); if(nch == '\r'||nch=='\n' || nch <0) break; if(xk1 < buff_len-2) { buff[xk1]=nch; xk1++; } } buff[xk1]='\n'; buff[xk1+1]=0; // printf("%d > %d\n", fp -> input_binary_stream_read_ptr , fp -> bam_file_next_section_start); if(fp -> input_binary_stream_read_ptr >= fp -> bam_file_next_section_start) { SamBam_read_ref_info(fp); fp -> bam_file_stage = BAM_FILE_STAGE_ALIGNMENT; } return buff; } else { SamBam_Alignment *aln = &fp->aln_buff; int chunk_ptr = 0; SB_FETCH(fp); if(SB_EOF(fp)) return NULL; int text_len = PBam_chunk_gets(SB_READ(fp) , &chunk_ptr, fp -> input_binary_stream_write_ptr - fp -> input_binary_stream_read_ptr , fp -> bam_chro_table, buff , buff_len, aln, seq_needed); SB_RINC(fp, chunk_ptr); if(text_len>0) return buff; return NULL; } } }
int SamBam_feof(SamBam_FILE * fp) { if(fp->file_type ==SAMBAM_FILE_SAM) return feof(fp->os_file); else return SB_EOF(fp); }
static void suboption(void) { unsigned char subchar; printsub('<', subbuffer, SB_LEN()+2); switch (subchar = SB_GET()) { case TELOPT_TTYPE: if (my_want_state_is_wont(TELOPT_TTYPE)) return; if (SB_EOF() || SB_GET() != TELQUAL_SEND) { return; } else { char *name; unsigned char temp[50]; int len; name = gettermname(); len = strlen(name) + 4 + 2; if (len < NETROOM()) { snprintf((char *)temp, sizeof(temp), "%c%c%c%c%s%c%c", IAC, SB, TELOPT_TTYPE, TELQUAL_IS, name, IAC, SE); ring_supply_data(&netoring, temp, len); printsub('>', &temp[2], len-2); } else ExitString("No room in buffer for terminal type.\n", 1); } break; case TELOPT_TSPEED: if (my_want_state_is_wont(TELOPT_TSPEED)) return; if (SB_EOF()) return; if (SB_GET() == TELQUAL_SEND) { long ospeed, ispeed; unsigned char temp[50]; int len; TerminalSpeeds(&ispeed, &ospeed); snprintf((char *)temp, sizeof(temp), "%c%c%c%c%ld,%ld%c%c", IAC, SB, TELOPT_TSPEED, TELQUAL_IS, ospeed, ispeed, IAC, SE); len = strlen((char *)temp+4) + 4; /* temp[3] is 0 ... */ if (len < NETROOM()) { ring_supply_data(&netoring, temp, len); printsub('>', temp+2, len - 2); } /*@*/ else printf("lm_will: not enough room in buffer\n"); } break; case TELOPT_LFLOW: if (my_want_state_is_wont(TELOPT_LFLOW)) return; if (SB_EOF()) return; switch(SB_GET()) { case LFLOW_RESTART_ANY: restartany = 1; break; case LFLOW_RESTART_XON: restartany = 0; break; case LFLOW_ON: localflow = 1; break; case LFLOW_OFF: localflow = 0; break; default: return; } setcommandmode(); setconnmode(0); break; case TELOPT_LINEMODE: if (my_want_state_is_wont(TELOPT_LINEMODE)) return; if (SB_EOF()) return; switch (SB_GET()) { case WILL: lm_will(subpointer, SB_LEN()); break; case WONT: lm_wont(subpointer, SB_LEN()); break; case DO: lm_do(subpointer, SB_LEN()); break; case DONT: lm_dont(subpointer, SB_LEN()); break; case LM_SLC: slc(subpointer, SB_LEN()); break; case LM_MODE: lm_mode(subpointer, SB_LEN(), 0); break; default: break; } break; case TELOPT_NEW_ENVIRON: if (SB_EOF()) return; switch(SB_PEEK()) { case TELQUAL_IS: case TELQUAL_INFO: if (my_want_state_is_dont(subchar)) return; break; case TELQUAL_SEND: if (my_want_state_is_wont(subchar)) { return; } break; default: return; } env_opt(subpointer, SB_LEN()); break; case TELOPT_XDISPLOC: if (my_want_state_is_wont(TELOPT_XDISPLOC)) return; if (SB_EOF()) return; if (SB_GET() == TELQUAL_SEND) { unsigned char temp[50], *dp; int len; if ((dp = env_getvalue("DISPLAY", 0)) == NULL) { /* * Something happened, we no longer have a DISPLAY * variable. So, turn off the option. */ send_wont(TELOPT_XDISPLOC, 1); break; } snprintf((char *)temp, sizeof(temp), "%c%c%c%c%s%c%c", IAC, SB, TELOPT_XDISPLOC, TELQUAL_IS, dp, IAC, SE); len = strlen((char *)temp+4) + 4; /* temp[3] is 0 ... */ if (len < NETROOM()) { ring_supply_data(&netoring, temp, len); printsub('>', temp+2, len - 2); } /*@*/ else printf("lm_will: not enough room in buffer\n"); } break; default: break; } }