110 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*  $Id$
 | 
						|
 | 
						|
    Part of SWI-Prolog
 | 
						|
 | 
						|
    Author:        Jan Wielemaker
 | 
						|
    E-mail:        J.Wielemaker@uva.nl
 | 
						|
    WWW:           http://www.swi-prolog.org
 | 
						|
    Copyright (C): 2009, University of Amsterdam
 | 
						|
 | 
						|
    This library is free software; you can redistribute it and/or
 | 
						|
    modify it under the terms of the GNU Lesser General Public
 | 
						|
    License as published by the Free Software Foundation; either
 | 
						|
    version 2.1 of the License, or (at your option) any later version.
 | 
						|
 | 
						|
    This library is distributed in the hope that it will be useful,
 | 
						|
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
						|
    Lesser General Public License for more details.
 | 
						|
 | 
						|
    You should have received a copy of the GNU Lesser General Public
 | 
						|
    License along with this library; if not, write to the Free Software
 | 
						|
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
						|
*/
 | 
						|
 | 
						|
#include <SWI-Stream.h>
 | 
						|
#include <SWI-Prolog.h>
 | 
						|
#include "error.h"
 | 
						|
#include <ctype.h>
 | 
						|
 | 
						|
static int
 | 
						|
print_byte(int value)
 | 
						|
{ if ( isgraph(value) || isspace(value) )
 | 
						|
  { Sdprintf("%c", value);
 | 
						|
  } else
 | 
						|
  { Sdprintf("\\\\%02x", value);
 | 
						|
  }
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
static int
 | 
						|
print_buffer(const char *data, size_t len)
 | 
						|
{ size_t i;
 | 
						|
 | 
						|
  Sdprintf("----------------\n");
 | 
						|
  for(i=0; i<len; i++)
 | 
						|
  { if ( data[i] == 0 )
 | 
						|
    { size_t zeros;
 | 
						|
 | 
						|
      for(zeros = 0; i+zeros < len && data[i+zeros] == 0; zeros++)
 | 
						|
	;
 | 
						|
      if ( zeros > 10 )
 | 
						|
      { Sdprintf("<%d 0-bytes>", zeros);
 | 
						|
      }
 | 
						|
      i += zeros;
 | 
						|
    } else
 | 
						|
    { print_byte(data[i]&0xff);
 | 
						|
    }
 | 
						|
  }
 | 
						|
  if ( data[len-1] != '\n' )
 | 
						|
    Sdprintf("\n");
 | 
						|
  Sdprintf("----------------\n");
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
static foreign_t
 | 
						|
stream_info(term_t stream)
 | 
						|
{ IOSTREAM *s;
 | 
						|
 | 
						|
  if ( !PL_get_stream_handle(stream, &s) )
 | 
						|
  { return pl_error("stream_info", 2, NULL, ERR_ARGTYPE, 1,
 | 
						|
		    stream, "stream");
 | 
						|
  }
 | 
						|
 | 
						|
  if ( (s->flags & SIO_INPUT) )
 | 
						|
  { if ( s->buffer )
 | 
						|
    { if ( s->bufp > s->buffer )
 | 
						|
      { Sdprintf("Processed input:\n");
 | 
						|
	print_buffer(s->buffer, s->bufp-s->buffer);
 | 
						|
      }
 | 
						|
 | 
						|
      if ( s->bufp < s->limitp )
 | 
						|
      { Sdprintf("Unprocessed input:\n");
 | 
						|
	print_buffer(s->bufp, s->limitp-s->bufp);
 | 
						|
      }
 | 
						|
    }
 | 
						|
  } else if ( (s->flags & SIO_OUTPUT) )
 | 
						|
  { if ( s->buffer )
 | 
						|
    { if ( s->bufp > s->buffer )
 | 
						|
      { Sdprintf("Buffered output:\n");
 | 
						|
	print_buffer(s->buffer, s->bufp-s->buffer);
 | 
						|
      }
 | 
						|
 | 
						|
      if ( s->bufp < s->limitp )
 | 
						|
      { Sdprintf("Possibly sent output (or junk):\n");
 | 
						|
	print_buffer(s->bufp, s->limitp-s->bufp);
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return PL_release_stream(s);
 | 
						|
}
 | 
						|
 | 
						|
install_t
 | 
						|
install_streaminfo()
 | 
						|
{ PL_register_foreign("$stream_info", 1, stream_info, 0);
 | 
						|
}
 |