fix format/2 to rely on stream's putc if no ~t is found on string.
git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1089 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
		
							
								
								
									
										77
									
								
								C/iopreds.c
									
									
									
									
									
								
							
							
						
						
									
										77
									
								
								C/iopreds.c
									
									
									
									
									
								
							@@ -651,7 +651,8 @@ MemPutc(int sno, int ch)
 | 
			
		||||
    char *newbuf;
 | 
			
		||||
 | 
			
		||||
    if ((newbuf = Yap_AllocAtomSpace(new_max_size*sizeof(char))) == NULL) {
 | 
			
		||||
      Yap_Error(SYSTEM_ERROR, TermNil, "YAP could not grow heap for writing to string");
 | 
			
		||||
      Yap_Error(OUT_OF_HEAP_ERROR, TermNil, "YAP could not grow heap for writing to string");
 | 
			
		||||
      return -1;
 | 
			
		||||
    }
 | 
			
		||||
#if HAVE_MEMMOVE
 | 
			
		||||
    memmove((void *)newbuf, (void *)s->u.mem_string.buf, (size_t)((s->u.mem_string.pos)*sizeof(char)));
 | 
			
		||||
@@ -3721,6 +3722,22 @@ fetch_index_from_args(Term t)
 | 
			
		||||
  return i;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
format_has_tabs(const char *seq)
 | 
			
		||||
{
 | 
			
		||||
  int ch;
 | 
			
		||||
 | 
			
		||||
  while ((ch = *seq++)) {
 | 
			
		||||
    if (ch == '~') {
 | 
			
		||||
      ch = *seq++;
 | 
			
		||||
      if (ch == 't') {
 | 
			
		||||
	return TRUE;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Int
 | 
			
		||||
format(Term tail, Term args, int sno)
 | 
			
		||||
{
 | 
			
		||||
@@ -3731,6 +3748,8 @@ format(Term tail, Term args, int sno)
 | 
			
		||||
  Int tnum, targ = 0;
 | 
			
		||||
  char *fstr = NULL, *fptr;
 | 
			
		||||
  Term oargs = args;
 | 
			
		||||
  int (* f_putc)(int, int);
 | 
			
		||||
  int has_tabs;
 | 
			
		||||
 | 
			
		||||
  if (IsVarTerm(tail)) {
 | 
			
		||||
    Yap_Error(INSTANTIATION_ERROR,tail,"format/2");
 | 
			
		||||
@@ -3788,6 +3807,11 @@ format(Term tail, Term args, int sno)
 | 
			
		||||
  format_buf_size = FORMAT_MAX_SIZE;
 | 
			
		||||
  format_error = FALSE;
 | 
			
		||||
 | 
			
		||||
  if ((has_tabs = format_has_tabs(fptr))) {
 | 
			
		||||
    f_putc = format_putc;
 | 
			
		||||
  } else {
 | 
			
		||||
    f_putc = Stream[sno].stream_putc;
 | 
			
		||||
  }
 | 
			
		||||
  while ((ch = *fptr++)) {
 | 
			
		||||
    Term t = TermNil;
 | 
			
		||||
    int has_repeats = FALSE;
 | 
			
		||||
@@ -3828,7 +3852,7 @@ format(Term tail, Term args, int sno)
 | 
			
		||||
	  goto do_instantiation_error;
 | 
			
		||||
	if (!IsAtomTerm(t))
 | 
			
		||||
	  goto do_type_atom_error;
 | 
			
		||||
	Yap_plwrite (t, format_putc, Handle_vars_f|To_heap_f);
 | 
			
		||||
	Yap_plwrite (t, f_putc, Handle_vars_f|To_heap_f);
 | 
			
		||||
	break;
 | 
			
		||||
      case 'c':
 | 
			
		||||
	{
 | 
			
		||||
@@ -3847,7 +3871,7 @@ format(Term tail, Term args, int sno)
 | 
			
		||||
	  if (!has_repeats)
 | 
			
		||||
	    repeats = 1;
 | 
			
		||||
	  for (i = 0; i < repeats; i++)
 | 
			
		||||
	    format_putc(sno, nch);
 | 
			
		||||
	    f_putc(sno, nch);
 | 
			
		||||
	  break;
 | 
			
		||||
	}
 | 
			
		||||
      case 'e':
 | 
			
		||||
@@ -3887,7 +3911,7 @@ format(Term tail, Term args, int sno)
 | 
			
		||||
	  sprintf (tmp2, tmp1, fl);
 | 
			
		||||
	  ptr = tmp2;
 | 
			
		||||
	  while ((ch = *ptr++) != 0)
 | 
			
		||||
	    format_putc(sno, ch);
 | 
			
		||||
	    f_putc(sno, ch);
 | 
			
		||||
	  break;
 | 
			
		||||
	case 'd':
 | 
			
		||||
	case 'D':
 | 
			
		||||
@@ -3900,7 +3924,7 @@ format(Term tail, Term args, int sno)
 | 
			
		||||
	  if (!IsIntegerTerm(t))
 | 
			
		||||
	    goto do_type_int_error;
 | 
			
		||||
	  if (!has_repeats) {
 | 
			
		||||
	    Yap_plwrite (t, format_putc, Handle_vars_f|To_heap_f);
 | 
			
		||||
	    Yap_plwrite (t, f_putc, Handle_vars_f|To_heap_f);
 | 
			
		||||
	  } else {
 | 
			
		||||
	    Int siz, dec = IntegerOfTerm(t), i, div = 1;
 | 
			
		||||
 | 
			
		||||
@@ -3910,7 +3934,7 @@ format(Term tail, Term args, int sno)
 | 
			
		||||
	     */
 | 
			
		||||
	    if (dec < 0) {
 | 
			
		||||
	      dec = -dec;
 | 
			
		||||
	      format_putc(sno, (int) '-');
 | 
			
		||||
	      f_putc(sno, (int) '-');
 | 
			
		||||
	    }
 | 
			
		||||
	    i = dec;
 | 
			
		||||
	    siz = 0;
 | 
			
		||||
@@ -3920,9 +3944,9 @@ format(Term tail, Term args, int sno)
 | 
			
		||||
	      div *= 10;
 | 
			
		||||
	    }
 | 
			
		||||
	    if (repeats > siz) {
 | 
			
		||||
	      format_putc(sno, (int) '.');
 | 
			
		||||
	      f_putc(sno, (int) '.');
 | 
			
		||||
	      while (repeats > siz) {
 | 
			
		||||
		format_putc(sno, (int) '0');
 | 
			
		||||
		f_putc(sno, (int) '0');
 | 
			
		||||
		repeats--;
 | 
			
		||||
	      }
 | 
			
		||||
	    } else {
 | 
			
		||||
@@ -3932,15 +3956,15 @@ format(Term tail, Term args, int sno)
 | 
			
		||||
		if (ch == 'D'&&
 | 
			
		||||
		    (siz - repeats) % 3 == 0 &&
 | 
			
		||||
		    output_done)
 | 
			
		||||
		  format_putc(sno, (int)',');
 | 
			
		||||
		format_putc(sno, (int)((dec/div)+'0'));
 | 
			
		||||
		  f_putc(sno, (int)',');
 | 
			
		||||
		f_putc(sno, (int)((dec/div)+'0'));
 | 
			
		||||
		output_done = TRUE;
 | 
			
		||||
		siz--;
 | 
			
		||||
		dec = dec%div;
 | 
			
		||||
	      }
 | 
			
		||||
	      format_putc(sno, (int) '.');
 | 
			
		||||
	      f_putc(sno, (int) '.');
 | 
			
		||||
	    }
 | 
			
		||||
	    Yap_plwrite (MkIntegerTerm(dec), format_putc, Handle_vars_f|To_heap_f);
 | 
			
		||||
	    Yap_plwrite (MkIntegerTerm(dec), f_putc, Handle_vars_f|To_heap_f);
 | 
			
		||||
	  break;
 | 
			
		||||
	  case 'r':
 | 
			
		||||
	  case 'R':
 | 
			
		||||
@@ -3964,7 +3988,7 @@ format(Term tail, Term args, int sno)
 | 
			
		||||
	      numb = IntegerOfTerm(t);
 | 
			
		||||
	      if (numb < 0) {
 | 
			
		||||
		numb = -numb;
 | 
			
		||||
		format_putc(sno, (int) '-');
 | 
			
		||||
		f_putc(sno, (int) '-');
 | 
			
		||||
	      }
 | 
			
		||||
	      i = numb;
 | 
			
		||||
	      while (i > 0) {
 | 
			
		||||
@@ -3975,11 +3999,11 @@ format(Term tail, Term args, int sno)
 | 
			
		||||
	      while (numb) {
 | 
			
		||||
		Int dig = numb/div;
 | 
			
		||||
		if (dig < 10) 
 | 
			
		||||
		  format_putc(sno, (int)(dig+'0'));
 | 
			
		||||
		  f_putc(sno, (int)(dig+'0'));
 | 
			
		||||
		else if (ch == 'r')
 | 
			
		||||
		  format_putc(sno, (int)((dig-10)+'a'));
 | 
			
		||||
		  f_putc(sno, (int)((dig-10)+'a'));
 | 
			
		||||
		else
 | 
			
		||||
		  format_putc(sno, (int)((dig-10)+'A'));
 | 
			
		||||
		  f_putc(sno, (int)((dig-10)+'A'));
 | 
			
		||||
		numb %= div;
 | 
			
		||||
		div /= radix;
 | 
			
		||||
	      }
 | 
			
		||||
@@ -4003,7 +4027,7 @@ format(Term tail, Term args, int sno)
 | 
			
		||||
	      goto do_consistency_error;
 | 
			
		||||
	    t = targs[targ++];
 | 
			
		||||
	    *--ASP = MkIntTerm(0);
 | 
			
		||||
	    Yap_plwrite (t, format_putc, Quote_illegal_f|Ignore_ops_f|To_heap_f );
 | 
			
		||||
	    Yap_plwrite (t, f_putc, Quote_illegal_f|Ignore_ops_f|To_heap_f );
 | 
			
		||||
	    ASP++;
 | 
			
		||||
	    break;
 | 
			
		||||
	  case 'p':
 | 
			
		||||
@@ -4013,7 +4037,7 @@ format(Term tail, Term args, int sno)
 | 
			
		||||
	    *--ASP = MkIntTerm(0);
 | 
			
		||||
	    { 
 | 
			
		||||
	      long sl = Yap_InitSlot(args);
 | 
			
		||||
	      Yap_plwrite(t, format_putc, Handle_vars_f|Use_portray_f|To_heap_f);
 | 
			
		||||
	      Yap_plwrite(t, f_putc, Handle_vars_f|Use_portray_f|To_heap_f);
 | 
			
		||||
	      args = Yap_GetFromSlot(sl);
 | 
			
		||||
	      Yap_RecoverSlots(1);
 | 
			
		||||
	    }
 | 
			
		||||
@@ -4035,7 +4059,7 @@ format(Term tail, Term args, int sno)
 | 
			
		||||
	      goto do_consistency_error;
 | 
			
		||||
	    t = targs[targ++];
 | 
			
		||||
	    *--ASP = MkIntTerm(0);
 | 
			
		||||
	    Yap_plwrite (t, format_putc, Handle_vars_f|Quote_illegal_f|To_heap_f);
 | 
			
		||||
	    Yap_plwrite (t, f_putc, Handle_vars_f|Quote_illegal_f|To_heap_f);
 | 
			
		||||
	    ASP++;
 | 
			
		||||
	    break;
 | 
			
		||||
	  case 'w':
 | 
			
		||||
@@ -4043,19 +4067,19 @@ format(Term tail, Term args, int sno)
 | 
			
		||||
	      goto do_consistency_error;
 | 
			
		||||
	    t = targs[targ++];
 | 
			
		||||
	    *--ASP = MkIntTerm(0);
 | 
			
		||||
	    Yap_plwrite (t, format_putc, Handle_vars_f|To_heap_f);
 | 
			
		||||
	    Yap_plwrite (t, f_putc, Handle_vars_f|To_heap_f);
 | 
			
		||||
	    ASP++;
 | 
			
		||||
	    break;
 | 
			
		||||
	  case '~':
 | 
			
		||||
	    if (has_repeats)
 | 
			
		||||
	      goto do_consistency_error;
 | 
			
		||||
	    format_putc(sno, (int) '~');
 | 
			
		||||
	    f_putc(sno, (int) '~');
 | 
			
		||||
	    break;
 | 
			
		||||
	  case 'n':
 | 
			
		||||
	    if (!has_repeats)
 | 
			
		||||
	      repeats = 1;
 | 
			
		||||
	    while (repeats--) {
 | 
			
		||||
	      format_putc(sno, (int) '\n');
 | 
			
		||||
	      f_putc(sno, (int) '\n');
 | 
			
		||||
	    }
 | 
			
		||||
	    column_boundary = 0;
 | 
			
		||||
	    pad_max = pad_entries;
 | 
			
		||||
@@ -4064,14 +4088,14 @@ format(Term tail, Term args, int sno)
 | 
			
		||||
	    if (!has_repeats)
 | 
			
		||||
	      has_repeats = 1;
 | 
			
		||||
	    if (Stream[sno].linepos != 0) {
 | 
			
		||||
	      format_putc(sno, (int) '\n');
 | 
			
		||||
	      f_putc(sno, (int) '\n');
 | 
			
		||||
	      column_boundary = 0;
 | 
			
		||||
	      pad_max = pad_entries;
 | 
			
		||||
	    }
 | 
			
		||||
	    if (repeats > 1) {
 | 
			
		||||
	      Int i;
 | 
			
		||||
	      for (i = 1; i < repeats; i++)
 | 
			
		||||
		format_putc(sno, (int) '\n');
 | 
			
		||||
		f_putc(sno, (int) '\n');
 | 
			
		||||
	      column_boundary = 0;
 | 
			
		||||
	      pad_max = pad_entries;
 | 
			
		||||
	    }
 | 
			
		||||
@@ -4101,6 +4125,7 @@ format(Term tail, Term args, int sno)
 | 
			
		||||
	      pad_max->pad = fptr[-2];
 | 
			
		||||
	    pad_max->pos = format_ptr-format_base;
 | 
			
		||||
	    pad_max++;
 | 
			
		||||
	    f_putc = format_putc;
 | 
			
		||||
	    break;
 | 
			
		||||
	  do_instantiation_error:
 | 
			
		||||
	    Yap_Error(INSTANTIATION_ERROR, t, "format/2");
 | 
			
		||||
@@ -4136,12 +4161,14 @@ format(Term tail, Term args, int sno)
 | 
			
		||||
      /* ok, now we should have a command */
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
      format_putc(sno, ch);
 | 
			
		||||
      f_putc(sno, ch);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if (has_tabs) {
 | 
			
		||||
    for (fptr = format_base; fptr < format_ptr; fptr++) {
 | 
			
		||||
      Stream[sno].stream_putc(sno, *fptr);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if (IsAtomTerm(tail)) {
 | 
			
		||||
    fstr = NULL;
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -3948,7 +3948,7 @@ The woods are love
 | 
			
		||||
@end example
 | 
			
		||||
 | 
			
		||||
@item '~w'
 | 
			
		||||
Print the next argument with @code{writeq/1}:
 | 
			
		||||
Print the next argument with @code{write/1}:
 | 
			
		||||
 | 
			
		||||
@example
 | 
			
		||||
?- format("Good night ~w",'Hello'+[1,2]).
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user