Beispiel #1
0
static int16_t second_recog(cell *c) {
	levcut(c, 1);
	if (db_status && (db_trace_flag & 2))
		est_snap(db_pass, c, "second rec linear");
	criteria(c);
	if (db_status && (db_trace_flag & 2))
		est_snap(db_pass, c, "second rec criteria");
	if (c->nvers == 0) {
		c->recsource &= 0;
		c->history &= 0;
	}
	return c->nvers;
}
Beispiel #2
0
Bool digital_last_context(void)
{
  cell *curr,*tmp;
  char punct_list[]="'\"=:";
  char sign_list[]="+-_";
  int16_t  l = strlen(punct_list),num,num_dig,num_bad,num_broken;
  uchar c,p;

if( db_status && snap_activity('c') )
 {
 snap_show_text("DIG : Digital last context");
 snap_monitor();
 }

 tmp = cell_f();
  while(   (tmp=tmp->next)->next )
    {
    if( tmp->nvers && tmp->vers[0].prob==2 )
      set_bad_cell(tmp);
    }
  num=num_dig=num_bad=num_broken=0;

  tmp = cell_f();
  while(   (tmp=tmp->next)->next && !(tmp->flg&(c_f_let|c_f_bad)) ); /* find let */
  curr = cell_f();
  if( tmp->next )
  {
  while( (curr=curr->next)!=tmp )
    if( (curr->flg&c_f_punct) &&
       !(curr->nvers>0 && memchr(sign_list,curr->vers[0].let,sizeof(sign_list))) )
      {
      curr = del_cell(curr);        /* kill first punctuation-cell */
      if( curr->next==NULL )break;
      }
  }

  curr = cell_l();
  while(   (curr=curr->prev)->prev && !(curr->flg&(c_f_let|c_f_bad)) ); /* find let */
  if( curr->next )
  {
  while( (curr=curr->next)->next )
    if( (curr->flg&c_f_punct) )
      {
      curr = del_cell(curr);        /* kill last punctuation-cell */
      if( curr->next==NULL )break;
      }

  }

  curr = cell_f();
  while(   (curr=curr->next)->next )
    {
    if( curr->flg&c_f_bad ) num_bad++;
    if( !(curr->flg&(c_f_let|c_f_punct)))  continue;

    c = curr->vers[0].let;
    if( memchr(punct_list,c,l) ||
        c==left_quocket || c==right_quocket ||
        c==low_quotes  // macros E.P.
	)
        {
        curr = del_cell(curr);
        if( curr->next==NULL )break;
        continue;
        }
        /*
    if( !enable_setup_alphabet && !test_alphabet_elem(c) )
        {
        curr = del_cell(curr);
        if( curr->next==NULL )break;
        continue;
        }
         */
    if( (curr->flg&c_f_let) )
      {
      //if( memchr("0123456789ОЃ°ЗІТВшl",c,19) &&
      if( isLikeDigit(c) && // 21.05.2002 E.P.
		  curr->vers[0].prob > 150  // Nick 26.02.2001
		)
		  num_dig++;
      if( memchr("С",c,1) )num_broken++;
      if( curr->flg&c_f_let )num++;
      }
    }

if( digital_mode==2     ||
    num_dig*4>=num*3 ||
    num_dig==2 && num==3 ||
    num_dig==1 && num==1 && num_bad==1 )
  { /* digital string */
  curr = cell_f();
  if( digital_mode==2 )
  while(   (curr=curr->next)->next )
      {
      if( !(curr->flg&(c_f_let|c_f_punct)))  continue;

      c = curr->vers[0].let;
      if ( c==liga_exm || c=='!' )
          curr=del_cell(curr);

      }

  curr = cell_f();
  while(   (curr=curr->next)->next )
      {
      if( curr->nvers<1 )  continue;

      c = curr->vers[0].let;
      p = curr->vers[0].prob;
      if( c==(uchar)'_' )
        curr->vers[0].let='-' ;
      if( c==(uchar)'ш' )
        curr->vers[0].let='2' ;
      if( c==(uchar)'О' ||
			// 21.05.2002 E.P.
			( c==(uchar)'Ѓ')&& !is_russian_turkish_conflict(c)
		)
        curr->vers[0].let='0' ;
      if( c==(uchar)'°' )
        curr->vers[0].let='6' ;
      if( c==(uchar)'З' || c==(uchar)'І')
        curr->vers[0].let='3' ;
      if( c==(uchar)'В' )
        curr->vers[0].let='8' ;
      if( c==(uchar)'С' && (p<190 || num_broken+num_dig==num ) )
        curr->vers[0].let='0' ;
      if( c==(uchar)'Т' || c==liga_exm || c=='!' || c=='|' )
        curr->vers[0].let='1' ;
      if( c==(uchar)'l' )
        curr->vers[0].let='1' ;

      if( c=='$' && curr->nvers==1 )
        {
        curr->vers[0].let='5';
        curr->vers[1].let='$';
        curr->vers[1].prob=curr->vers[0].prob-10;
        curr->nvers=2;
        }

      if( c=='5' && curr->nvers>2 && curr->vers[1].let==(uchar)'°' &&
          p==curr->vers[1].prob && curr->vers[2].let=='6' &&
          curr->vers[2].prob>150 )
          { /* alternates : °56 -->>CONTEXT-->> 5°6 */
          curr->vers[0].let='6';
          curr->vers[2].let='5';
          }
      }
  }

digital_mode=0;
set_all_alphabet();
for(curr=cell_f()->nextl;curr!=cell_l();curr=curr->nextl)
    {
    if( curr->flg&c_f_bad )
        {
        s_glue GL={0};
        short_recog_cell(curr);
        if( curr->nvers<1 )
          {
          GL.celist[0]=curr;
          GL.maxlist[0]=curr;
          GL.complist[0]=curr->env;
          GL.maxlist[1]=GL.celist[1]=NULL;
          GL.complist[1]=NULL;
          GL.ncell=1;
          GL.row   = curr->row; GL.col    = curr->col;
          GL.width = curr->w;   GL.height = curr->h;

          if( crecell(curr,&GL,3)>=0)
            dmBOX(curr,&GL);
          }
        criteria(curr);
        levcut(curr,1);

        if( curr->nvers<1 || curr->vers[0].prob<220 )
          { // restore bad sybmol
          set_bad_cell(curr);
          }

        if( curr->nvers && curr->vers[0].let=='|' )
		{
            curr->vers[0].let='1';

			// Nick add 26.02.2001 - test artificial '1'
			levcut(curr,1);
            if( curr->nvers<1 || curr->nvers==1 && curr->vers[0].let!='1' || curr->vers[0].prob<220 )
			{ // restore bad sybmol
              set_bad_cell(curr);
			}
		}
      }
    }

    for(curr=cell_f()->nextl;curr!=cell_l();curr=curr->nextl)
    {
    if( curr->nvers && curr->vers[0].let=='(' &&
        curr->next &&
        curr->next->nvers && curr->next->vers[0].let==')' )
        {
        clist[0]=curr;
        clist[1]=curr->next;
        compose_cell(2,clist,curr);
        curr->vers[0].let='0';
        curr->vers[1].prob=220;
        curr->nvers=1;
        }
    }

if( db_status && snap_activity('c') )
 {
 snap_show_text("DIG : Digital last context end");
 snap_monitor();
 }

 num_dig = 0;   // Nick 26.02.2001
 num = 0;
 for(curr=cell_f()->nextl;curr!=cell_l();curr=curr->nextl,num++)
 {
 // 21.05.2002 E.P.
 Bool likeDigit = isLikeDigit(curr->vers[0].let);

 if( curr->nvers<1 || curr->vers[0].prob<150 && likeDigit)
    return 0;  // bad symbols or small propability

  if( likeDigit )
	  num_dig++;
 }

 if( num_dig*2 <= num )  // Nick 26.02.2001
	 return 0;

 return 1;
}
//
// rotate word cells
//
int16_t erection_incline_word(cell *b, cell *e, int16_t base_3, int16_t n_call)
{
cell  *c, *tmp, *cnext                  ;
int32_t  inc,    i                         ;
int16_t   shave=(erection_enable==2)        ;
version save_versions[VERS_IN_CELL]     ;
int16_t   save_nvers                        ;

if( (inc=get_incline_of_word(b,e))==0 )
  return 0;
if( 1&&!test_incline_of_word(b,e,inc) )
    return 0;

for(i=0, c=b; c!=e; c=c->next, i++)
  {
  tmp = c->prev; // left cell
  cnext=c->next; // right cell
  if( local_pass )
    {
    if( c->pos_inc&erect_rot )
        continue;
    if( c->stick_inc!=NO_INCLINE && (((long)c->stick_inc*c->h)/204l)>16 &&
      ( (c->flg==c_f_bad) && c->stick_inc<max_incline ||
      c->nvers>0 && (memchr(incline_chars,c->vers[0].let,sizeof(incline_chars)) &&
		!is_russian_baltic_conflict(c->vers[0].let)&&// 17.07.2001 E.P.
		!is_russian_turkish_conflict(c->vers[0].let) // 21.05.2002 E.P.
	  ||
      erect_solid_stick(c))) )
        c->save_stick_inc = c->stick_inc;
    else
        c->save_stick_inc = (int16_t)inc;
    c->pos_inc = erect_rest;
    continue;
    }
  // rotate cell images
  if( c->stick_inc!=NO_INCLINE && (((long)c->stick_inc*c->h)/204l)>16 &&
      ( (c->flg==c_f_bad) && c->stick_inc<max_incline ||
      c->nvers>0 && (memchr(incline_chars,c->vers[0].let,sizeof(incline_chars)) &&
		!is_russian_baltic_conflict(c->vers[0].let)&&// 17.07.2001 E.P.
		!is_russian_turkish_conflict(c->vers[0].let) // 21.05.2002 E.P.
	  ||
      erect_solid_stick(c))) )
    c=erect_cell_value (c, c->stick_inc, shave , TRUE);
  else
    c=erect_cell_value (c, (int16_t)inc, shave , TRUE);

  for(tmp = tmp->next;tmp!=cnext;tmp=tmp->next)
    {    // shift cell boxes
    erect_rotate_bl(tmp,base_3,inc,-1);//(int16_t)(line_scale?(base_3>>line_scale):base_3),inc,-1);
    v2_pidx_crit(tmp);
    if( (save_nvers = c->nvers)>0 )
        memcpy(save_versions,c->vers,VERS_IN_CELL*sizeof(version));
    // recognizing corrected images
    if( (tmp->flg&(c_f_bad|c_f_let)) && !local_pass)
      {
      if(n_call==0  )
        {
        if( tmp->nvers>0 &&
			memchr(disable_rerecog,tmp->vers[0].let,sizeof(disable_rerecog) ) &&
				!is_russian_baltic_conflict(tmp->vers[0].let)&&// 17.07.2001 E.P.
				!is_russian_turkish_conflict(tmp->vers[0].let)   // 21.05.2002 E.P.
			||
            tmp->nvers<1 )
          {
          short_recog_cell( tmp );
          levcut(tmp,1);
          add_versions(tmp, save_versions, save_nvers);
          } // end of spec letters for 1 pass
        }
      else
        {
        s_glue GL={0};

        GL.celist[0]   = tmp;
        GL.maxlist[0]  = tmp;
        GL.complist[0] = tmp->env;
        GL.maxlist[1]  = GL.celist[1]=NULL;
        GL.complist[1] = NULL;
        GL.ncell       = 1;
        GL.row         = tmp->row;
        GL.col         = tmp->col;
        GL.width       = tmp->w;
        GL.height      = tmp->h;

        if(crecell(tmp,&GL,3)>=0)
          dmBOX(tmp,&GL);
        } // end of spec letters for 2 pass
      } // end of if letter
    } // end of cykl tmp
  }

return (int16_t)inc;
}