/* This subroutine is in charge with a/ getting file for disk b/ engendering all the necessaries structures c/ setting up the pointers */ int16_t begin(uchar batch_run) { /* int16_t *p;*/ uint16_t i; uint16_t i1; /* uint32_t l;*/ SPQ.real_num = 0; SPQ.sw_symb = 0; SPQ.new_s = 0 ; SPQ.beg_sheet = 0; //sign new_sheet passed and there were no fragm SPQ.stack = (struct state_stack_elem *)( SPQ.end_alloc_mem - sizeof(struct state_stack_elem)); SPQ.tab_ptr = (struct tab *)SPQ.free_alloc_mem; SPQ.free_alloc_mem += sizeof(struct tab); //AK!!!! wich stupid not attented bounds of array!!!!!! for (i=0; i < MAX_SHEET; i++) for (i1=0; i1 < MAX_FRAGM; i1++) SPQ.tab_ptr->tab_fragm[i][i1].first_segm = NULL; SPQ.st.cur_segm = (struct segm *)(SPQ.free_alloc_mem); SPQ.st.cur_segm->busy_lth = 0; SPQ.st.cur_segm->string_lth = 0; SPQ.free_alloc_mem += sizeof(struct segm); SPQ.str_ptr = SPQ.st.cur_segm->string; SPQ.st.cur_segm->next_in_sheet = NULL; SPQ.st.cur_segm->prev_in_sheet = NULL; SPQ.st.cur_segm->prev_in_fragm = NULL; SPQ.st.cur_segm->next_in_fragm = NULL; SPQ.end_l = 0; SPQ.last_del_line = NULL; SPQ.stack_change_flag = YES; memset(SPQ.fragm_flag,NONEXIST,sizeof(SPQ.fragm_flag)); if( read_file(batch_run)== FALSE) return FALSE; SPQ.st.cur_segm=(struct segm *)SPQ.tab_ptr->tab_fragm[0][0].first_segm; skip_letter_in_line(SPQ.st.cur_segm,0); SPQ.st.cur_symb=SPQ.ns_symb; create_new_stack(); SPQ.stack->map_ref.row=0; SPQ.stack->map_ref.col=0; return TRUE; }
uchar *next_symb(int16_t i, int16_t j, int16_t k, struct segm *cur_segm, uchar *cur_symb) /* This procedure is in charge with sleathering through the string. i=YES means missing rule symbols,returns pointer to the next letter of the string. j=YES means missing alternatives. k=YES means search in all segments of given line. k=NO means searh in given segm */ //int16_t i,j,k; //struct segm *cur_segm; //uchar *cur_symb; { uint16_t ret; uchar l; void * NsCache[8]; uint16_t NsCount = 0; /* struct segm *segm_ptr; */ if (cur_symb == NULL) return(NULL); SPQ.ns_segm=cur_segm; SPQ.N.beg_next=YES; SPQ.N.end_altern=YES; SPQ.end_s=0; SPQ.end_l=0; ret=NO; SPQ.N.last_altern=NO; SPQ.ns_symb=cur_symb; if (check_mem(k) == YES) return(NULL); while (1) { switch (*SPQ.ns_symb) { case SS_SHEET_DESCR: SPQ.end_altern=1; l = (uchar)SPQ.tab_ptr->tab_sheet_descr[SPQ.cur_sheet].lth; SPQ.ns_symb=&SPQ.ns_segm->string[l]; break; case SS_LANGUAGE : SPQ.ns_symb=SPQ.ns_symb+sizeof(struct EdTagLanguage); break; case SS_FRAGMENT: SPQ.cur_fragm=((struct fragm_disk *)SPQ.ns_symb)->fragm_numb; if (SPQ.stack_change_flag == YES) create_new_stack(); SPQ.end_altern=1; SPQ.ns_symb=SPQ.ns_symb+sizeof(struct fragm_disk); break; case SS_BITMAP_REF: SPQ.h_bit_map_ref_ptr= (struct bit_map_ref *)SPQ.ns_symb; if (SPQ.stack_change_flag == YES) { SPQ.stack->ns_ref_ptr=SPQ.ns_symb; SPQ.stack->map_ref.row= SPQ.h_bit_map_ref_ptr->row; SPQ.stack->map_ref.col= SPQ.h_bit_map_ref_ptr->col; SPQ.stack->map_ref.width= SPQ.h_bit_map_ref_ptr->width; SPQ.stack->map_ref.height= SPQ.h_bit_map_ref_ptr->height; } SPQ.ns_symb=SPQ.ns_symb+sizeof(struct bit_map_ref); break; case SS_STEP_BACK: SPQ.ns_symb=SPQ.ns_symb+sizeof(struct step_back); break; case SS_TEXT_REF: SPQ.h_text_ref_ptr=(struct text_ref *)SPQ.ns_symb; if (SPQ.stack_change_flag == YES) switch(SPQ.h_text_ref_ptr->type) { case 0: SPQ.stack->letter_ref= SPQ.h_text_ref_ptr->object;break; case 1: SPQ.stack->halo_ref= SPQ.h_text_ref_ptr->object;break; case 2: SPQ.stack->word_ref= SPQ.h_text_ref_ptr->object;break; case 3: SPQ.stack->line_ref= SPQ.text_ref_ptr->object; break; } SPQ.ns_symb=SPQ.ns_symb+sizeof(struct text_ref); break; case SS_FONT_KEGL: SPQ.h_font_kegl_ptr=(struct font_kegl *)SPQ.ns_symb; if (SPQ.stack_change_flag == YES) { push_stack(); SPQ.stack->kegl = SPQ.h_font_kegl_ptr->new_kegl; SPQ.stack->font = (uchar)SPQ.h_font_kegl_ptr->new_font; } SPQ.ns_symb=SPQ.ns_symb+sizeof(struct font_kegl); break; case SS_KEGL: SPQ.h_kegl_ptr=(struct kegl *)SPQ.ns_symb; if (SPQ.stack_change_flag == YES) { push_stack(); SPQ.stack->kegl=SPQ.h_kegl_ptr->new_kegl; } SPQ.ns_symb=SPQ.ns_symb+sizeof(struct kegl); break; case SS_SHIFT: SPQ.h_shift_ptr=(struct shift_struct *)SPQ.ns_symb; if (SPQ.stack_change_flag == YES) { push_stack(); SPQ.stack->stack_type=2; l=SPQ.stack->line_row+SPQ.h_shift_ptr->kegl; SPQ.stack->line_row=l; } SPQ.ns_symb=SPQ.ns_symb+sizeof(struct shift_struct); break; case SS_RETR_LEVEL: if (SPQ.stack_change_flag == YES) { pop_stack(); SPQ.stack->stack_type=2; } SPQ.ns_symb=SPQ.ns_symb+sizeof(struct retrieve_level); break; case SS_UNDERLINE: SPQ.h_underline_ptr= (struct underline *)SPQ.ns_symb; if (SPQ.stack_change_flag == YES) { if (SPQ.h_underline_ptr->type < 6) push_stack(); if (SPQ.h_underline_ptr->type < 4) SPQ.stack->font_type=SPQ.h_underline_ptr->type; else SPQ.stack->underline=SPQ.h_underline_ptr->type; } SPQ.ns_symb=SPQ.ns_symb+sizeof(struct underline); break; case SS_DENS_PRINT: SPQ.h_dens_print_ptr=(struct dens_print *)SPQ.ns_symb; if (SPQ.stack_change_flag == YES) { push_stack(); SPQ.stack->density=SPQ.h_dens_print_ptr->dens_atr; } SPQ.ns_symb=SPQ.ns_symb+sizeof(struct dens_print); break; case SS_TABUL: SPQ.ns_symb=SPQ.ns_symb+sizeof(struct tabul); break; case SS_TABL_TABUL: l=*(SPQ.ns_symb+1); if(l==0) l=1; SPQ.ns_symb=SPQ.ns_symb+l; break; case SS_LINE_BEG: if (SPQ.stack_change_flag == YES) create_new_stack(); SPQ.end_altern=1; SPQ.st.position=0; SPQ.ns_symb=SPQ.ns_symb+sizeof(struct line_beg); break; case SS_POSITION: SPQ.h_position_ptr=(struct position *)SPQ.ns_symb; if (SPQ.stack_change_flag == YES) SPQ.stack->position=SPQ.h_position_ptr->pos; SPQ.ns_symb=SPQ.ns_symb+sizeof(struct position); break; case SS_TABL_CONFORM_SIZES: SPQ.ns_symb=SPQ.ns_symb+sizeof(struct tabl_conform_sizes); break; case SS_GROUP_WORDS: if (SPQ.stack_change_flag == YES) SPQ.stack->stack_type=1; SPQ.ns_symb=SPQ.ns_symb+sizeof(struct group_words); break; case SS_GROUP_SYMBOLS: if (SPQ.stack_change_flag == YES) SPQ.stack->stack_type=1; SPQ.ns_symb=SPQ.ns_symb+sizeof(struct group_symbols); break; case SS_AKSANT: SPQ.ns_symb=SPQ.ns_symb+sizeof(struct aksant); break; case SS_NEG_HALF_SPACE: SPQ.ns_symb=SPQ.ns_symb+sizeof(struct neg_half_space); break; case SS_POS_HALF_SPACE: SPQ.ns_symb=SPQ.ns_symb+sizeof(struct pos_half_space); break; default: if((*SPQ.ns_symb<0x20)&&(*SPQ.ns_symb!=0x15)) SPQ.ns_symb+=ED_LREC(SPQ.ns_symb); else { if ((*(SPQ.ns_symb+1) & 0x1)) SPQ.N.end_altern=YES; else SPQ.N.end_altern=NO; SPQ.ns_symb+=sizeof(LT); } break; } /* end of big switch */ ret=esc_next_symb(i,j,k); if (ret == YES) return(SPQ.ns_symb); // Allex 28/01/2000 //временная заглушка на случай зацикливания NsCache[NsCount++] = (void *) SPQ.ns_symb; if ( NsCount > 1 ) if ( NsCache[NsCount-2] != NsCache[NsCount-1] ) { NsCount = 0; } if ( NsCount == 8 ) ErrorExit(RLING_ERROR_WRONG_ED_FILE); //return(SPQ.ns_symb); // конец заглушки } /* end of while */ /* return(SPQ.ns_symb);*/ }