예제 #1
0
int16_t processEdSymb(void)
{
	int16_t ret = YES;
	int16_t n;

	switch (*SPQ.buff_ptr)
	{
		case SS_BITMAP_REF: ret=mvbuf(sizeof(struct bit_map_ref));
							break;
		case SS_TEXT_REF  : ret=mvbuf(sizeof(struct text_ref));
							break;
		case SS_LANGUAGE  : ret=mvbuf(sizeof(struct EdTagLanguage));
							break;
		case SS_FONT_KEGL : ret=mvbuf(sizeof(struct font_kegl));
							break;
		case SS_KEGL      : ret=mvbuf(sizeof(struct kegl));
							break;
		case SS_SHIFT     : ret=mvbuf(sizeof(struct shift_struct));
							break;
		case SS_RETR_LEVEL : ret=mvbuf(sizeof(struct retrieve_level));
							break;
		case SS_UNDERLINE : ret=mvbuf(sizeof(struct underline));
							break;
		case SS_DENS_PRINT: ret=mvbuf(sizeof(struct dens_print));
							break;
		case SS_TABUL     : ret=mvbuf(sizeof(struct tabul));
							break;
		case SS_TABL_TABUL: if (SPQ.buff_ptr-(uchar*)SPQ.text_buff >= SPQ.buff_l-1)
								ret=NO;
							else
							 {
								n=*(SPQ.buff_ptr+1); /* length of tabl */
								ret=mvbuf((uint16_t)(n+1));
							 }
							break;
		case SS_SHEET_DESCR:
			ret=set_descr(SHEET);
			break;
		case SS_FRAGMENT  : ret=do_fragm();
							break;
		case  SS_STEP_BACK: ret=mvbuf(sizeof(struct step_back));
							break;
		case SS_LINE_BEG  : ret=set_descr(LINE);
							break;
		case  SS_POSITION : ret=mvbuf(sizeof(struct step_back));
							break;
		case SS_TABL_CONFORM_SIZES: ret=mvbuf(sizeof(struct  tabl_conform_sizes));
							break;
		case SS_GROUP_WORDS: ret=mvbuf(sizeof(struct group_words));
							break;
		case  SS_GROUP_SYMBOLS: ret=mvbuf(sizeof(struct group_symbols));
							break;
		case SS_AKSANT    : ret=mvbuf(sizeof(struct aksant));
							break;
		case SS_NEG_HALF_SPACE: ret=mvbuf(sizeof(struct neg_half_space));
							break;
		case SS_POS_HALF_SPACE: ret=mvbuf(sizeof(struct pos_half_space));
							break;
		default           :
				if(*SPQ.buff_ptr<0x20)
				  ret=mvbuf((uint16_t)(ED_LREC(SPQ.buff_ptr)));
				else
				  ret=mvbuf((uint16_t)(sizeof(LT)));/* letter */
							break;
       }                             /* end of switch */

	if ( ret == -1 )
	{
		ret = 0;
	}

	return ret;
 }
예제 #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);*/
 }