Example #1
0
/*
    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;
 }
Example #2
0
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);*/
 }