rem: v = read_list(port, stxsrc, line, col, pos, EOF, mz_shape_cons, 0, ht, indentation, params);
add: v = read_list(port, stxsrc, line, col, pos, EOF, mz_shape_cons, 0, ht, indentation, &params_copy);
context: read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table **ht,		 Scheme_Object *indentation, ReadParams *params,		 int comment_mode, int pre_char, Readtable *table){  int ch, ch2, depth, dispatch_ch;  long line = 0, col = 0, pos = 0;  Scheme_Object *special_value;#ifdef DO_STACK_CHECK  {# include "mzstkchk.h"    {      Scheme_Thread *p = scheme_current_thread;      Scheme_Object *pr;      ReadParams *params2;      /* params may be on the stack, so move it to the heap: */      params2 = MALLOC_ONE_RT(ReadParams);      memcpy(params2, params, sizeof(ReadParams));#ifdef MZ_PRECISE_GC      params2->type = scheme_rt_read_params;#endif      p->ku.k.p1 = (void *)port;      p->ku.k.p2 = (void *)ht;      p->ku.k.p3 = (void *)stxsrc;      pr = scheme_make_pair(indentation, (Scheme_Object *)params2);      p->ku.k.p4 = (void *)pr;      p->ku.k.p5 = (void *)table;      p->ku.k.i1 = comment_mode;      p->ku.k.i2 = pre_char;      return scheme_handle_stack_overflow(read_inner_inner_k);    }  }#endif start_over:  SCHEME_USE_FUEL(1);  while (1) {    if (pre_char >= 0) {      ch = pre_char;      pre_char = -1;    } else      ch = scheme_getc_special_ok(port);    if (NOT_EOF_OR_SPECIAL(ch)) {      if (table) {	if (!(readtable_kind(table, ch, params) & READTABLE_WHITESPACE))	  break;      } else if (!scheme_isspace(ch))	break;    } else      break;  } start_over_with_ch:  scheme_tell_all(port, &line, &col, &pos);  /* Found non-whitespace. Track indentation: */  if (col >= 0) {    if (SCHEME_PAIRP(indentation)) {      /* Ignore if it's a comment start or spurious closer: */      if ((ch != ';')	  && !((ch == '#') && (scheme_peekc_special_ok(port) == '|'))	  && (ch != ')')	  && ((ch != '}') || !params->curly_braces_are_parens)	  && ((ch != ']') || !params->square_brackets_are_parens)) {	track_indentation(indentation, line, col);      }    }  }  special_value = NULL;  if (table && NOT_EOF_OR_SPECIAL(ch)) {    Scheme_Object *v;    int use_default, ch2 = ch;    v = readtable_handle(table, &ch2, &use_default, params,			 port, stxsrc, line, col, pos, ht);    if (!use_default) {      dispatch_ch = SCHEME_SPECIAL;      special_value = v;    } else      dispatch_ch = ch2;  } else    dispatch_ch = ch;  switch ( dispatch_ch )    {    case EOF:       return scheme_eof;    case SCHEME_SPECIAL:      {	Scheme_Object *v;	if (special_value)	  v = special_value;	else	  v = scheme_get_special(port, stxsrc, line, col, pos, 0, ht);	if (scheme_special_comment_value(v)) {	  /* a "comment" */	  if (comment_mode & RETURN_FOR_SPECIAL_COMMENT)	    return NULL;	  else	    goto start_over;	} else if (SCHEME_STXP(v)) {	  if (!stxsrc)	    v = scheme_syntax_to_datum(v, 0, NULL);	} else if (stxsrc) {	  Scheme_Object *s;	  s = scheme_make_stx_w_offset(scheme_false, line, col, pos, SPAN(port, pos), stxsrc, STX_SRCTAG);	  v = scheme_datum_to_syntax(v, s, scheme_false, 1, 0);	}	if (!special_value)	  v = copy_to_protect_placeholders(v, stxsrc, ht);	return v;      }    case ']':      if (!params->square_brackets_are_parens) {	scheme_read_err(port, stxsrc, line, col, pos, 1, 0, indentation, "read: illegal use of close square bracket");	return NULL;      } else {	unexpected_closer(ch, port, stxsrc, line, col, pos, indentation);	return NULL;      }    case '}':      if (!params->curly_braces_are_parens) {	scheme_read_err(port, stxsrc, line, col, pos, 1, 0, indentation, "read: illegal use of close curly brace");	return NULL;      } else {	unexpected_closer(ch, port, stxsrc, line, col, pos, indentation);	return NULL;      }    case ')':      unexpected_closer(ch, port, stxsrc, line, col, pos, indentation);      return NULL;    case '(':      return read_list(port, stxsrc, line, col, pos, ')', mz_shape_cons, 0, ht, indentation, params);    case '[':      if (!params->square_brackets_are_parens) {	scheme_read_err(port, stxsrc, line, col, pos, 1, 0, indentation, "read: illegal use of open square bracket");	return NULL;      } else	return read_list(port, stxsrc, line, col, pos, ']', mz_shape_cons, 0, ht, indentation, params);    case '{':      if (!params->curly_braces_are_parens) {	scheme_read_err(port, stxsrc, line, col, pos, 1, 0, indentation, "read: illegal use of open curly brace");	return NULL;      } else	return read_list(port, stxsrc, line, col, pos, '}', mz_shape_cons, 0, ht, indentation, params);    case '|':      return read_symbol(ch, port, stxsrc, line, col, pos, ht, indentation, params, table);    case '"':      return read_string(0, 0, port, stxsrc, line, col, pos, ht, indentation, params);    case '\'':      if (params->honu_mode) {	return read_string(0, 1, port, stxsrc, line, col, pos, ht, indentation, params);      } else {	return read_quote("quoting '", quote_symbol, 1, port, stxsrc, line, col, pos, ht, indentation, params);      }    case '`':      if (params->honu_mode) {	/* Raises illegal-char error: */	return read_symbol(ch, port, stxsrc, line, col, pos, ht, indentation, params, table);      } else if (!params->can_read_quasi) {	scheme_read_err(port, stxsrc, line, col, pos, 1, 0, indentation, "read: illegal use of backquote");	return NULL;      } else	return read_quote("quasiquoting `", quasiquote_symbol, 1, port, stxsrc, line, col, pos, ht, indentation, params);    case ',':      if (params->honu_mode) {	if (stxsrc)	  return scheme_make_stx_w_offset(honu_comma, line, col, pos, SPAN(port, pos), stxsrc, STX_SRCTAG);	else	  return honu_comma;      } else if (!params->can_read_quasi) {	scheme_read_err(port, stxsrc, line, col, pos, 1, 0, indentation, "read: illegal use of comma");	return NULL;      } else {	if (scheme_peekc_special_ok(port) == '@') {	  ch = scheme_getc(port); /* must be '@' */	  return read_quote("unquoting ,@", unquote_splicing_symbol, 2, port, stxsrc, line, col, pos, ht, indentation, params);	} else	  return read_quote("unquoting ,", unquote_symbol, 1, port, stxsrc, line, col, pos, ht, indentation, params);      }    case ';':      if (params->honu_mode) {	if (stxsrc)	  return scheme_make_stx_w_offset(honu_semicolon, line, col, pos, SPAN(port, pos), stxsrc, STX_SRCTAG);	else	  return honu_semicolon;      } else {	while (((ch = scheme_getc_special_ok(port)) != '\n') && (ch != '\r')) {	  if (ch == EOF)	    return scheme_eof;	  if (ch == SCHEME_SPECIAL)	    scheme_get_ready_read_special(port, stxsrc, ht);	}	if ((table && (comment_mode & RETURN_FOR_SPECIAL_COMMENT))	    || (comment_mode & RETURN_FOR_COMMENT))	  return NULL;	goto start_over;      }    case '+':    case '-':      if (params->honu_mode) {	return read_symbol(ch, port, stxsrc, line, col, pos, ht, indentation, params, table);      }    case '.': /* ^^^ fallthrough ^^^ */      ch2 = scheme_peekc_special_ok(port);      if ((NOT_EOF_OR_SPECIAL(ch2) && isdigit_ascii(ch2)) || (ch2 == '.')	  || (!params->honu_mode	      && ((ch2 == 'i') || (ch2 == 'I') /* Maybe inf */		  || (ch2 == 'n') || (ch2 == 'N') /* Maybe nan*/ ))) {	return read_number(ch, port, stxsrc, line, col, pos, 0, 0, 10, 0, ht, indentation, params, table);      } else {	return read_symbol(ch, port, stxsrc, line, col, pos, ht, indentation, params, table);      }    case '#':      ch = scheme_getc_special_ok(port);      if (table) {	Scheme_Object *v;	int use_default;	v = readtable_handle_hash(table, ch, &use_default, params,				  port, stxsrc, line, col, pos, ht);	if (!use_default) {	  if (v)	    return v;	  if (comment_mode & RETURN_FOR_SPECIAL_COMMENT)	    return NULL;	  goto start_over;	}      }      switch ( ch )	{	case EOF:	case SCHEME_SPECIAL:	  scheme_read_err(port, stxsrc, line, col, pos, 1, ch, indentation, "read: bad syntax `#'");	  break;	case ';':	  {	    Scheme_Object *skipped;	    skipped = read_inner(port, stxsrc, ht, indentation, params, 0);	    if (SCHEME_EOFP(skipped))	      scheme_read_err(port, stxsrc, line, col, pos, SPAN(port, pos), EOF, indentation,			      "read: expected a commented-out element for `#;' (found end-of-file)");	    /* For resolving graphs introduced in #; : */	    if (*ht) {	      Scheme_Object *v;	      v = scheme_hash_get(*ht, an_uninterned_symbol);	      if (!v)		v = scheme_null;	      v = scheme_make_pair(skipped, v);	      scheme_hash_set(*ht, an_uninterned_symbol, v);	    }	    if ((comment_mode & RETURN_FOR_HASH_COMMENT)		|| (table && (comment_mode & RETURN_FOR_SPECIAL_COMMENT))		|| (comment_mode & RETURN_FOR_COMMENT))	      return NULL;	    goto start_over;	  }	  break;	case '%':	  if (!params->honu_mode) {	    scheme_ungetc('%', port);	    return read_symbol('#', port, stxsrc, line, col, pos, ht, indentation, params, table);	  }	  break;	case '(':	  if (!params->honu_mode) {	    return read_vector(port, stxsrc, line, col, pos, ')', -1, NULL, ht, indentation, params);	  }	  break;	case '[':	  if (!params->honu_mode) {	    if (!params->square_brackets_are_parens) {	      scheme_read_err(port, stxsrc, line, col, pos, 2, 0, indentation, "read: bad syntax `#['");	      return NULL;	    } else	      return read_vector(port, stxsrc, line, col, pos, ']', -1, NULL, ht, indentation, params);	  }	  break;	case '{':	  if (!params->honu_mode) {	    if (!params->curly_braces_are_parens) {	      scheme_read_err(port, stxsrc, line, col, pos, 2, 0, indentation, "read: bad syntax `#{'");	      return NULL;	    } else	      return read_vector(port, stxsrc, line, col, pos, '}', -1, NULL, ht, indentation, params);	  }	  break;	case '\\':	  if (!params->honu_mode) {	    Scheme_Object *chr;	    chr = read_character(port, stxsrc, line, col, pos, ht, indentation, params);	    if (stxsrc)	      chr = scheme_make_stx_w_offset(chr, line, col, pos, SPAN(port, pos), stxsrc, STX_SRCTAG);	    return chr;	  }	  break;	case 'T':	case 't': 	  if (!params->honu_mode) {	    return (stxsrc		    ? scheme_make_stx_w_offset(scheme_true, line, col, pos, 2, stxsrc, STX_SRCTAG)		    : scheme_true);	  }	case 'F':	case 'f': 	  if (!params->honu_mode) {	    return (stxsrc		    ? scheme_make_stx_w_offset(scheme_false, line, col, pos, 2, stxsrc, STX_SRCTAG)		    : scheme_false);	  }	case 'c':	case 'C':	  if (!params->honu_mode) {	    Scheme_Object *v;	    int sens = 0;	    int save_sens;	    ch = scheme_getc_special_ok(port);	    switch ( ch ) {	    case 'i':	    case 'I':	      sens = 0;	      break;	    case 's':	    case 'S':	      sens = 1;	      break;	    default:	      scheme_read_err(port, stxsrc, line, col, pos, 2, ch, indentation,			      "read: expected `s' or `i' after #c");	      return NULL;	    }	    save_sens = params->case_sensitive;	    params->case_sensitive = sens;	    	    v = read_inner(port, stxsrc, ht, indentation, params, 0);	    	    params->case_sensitive = save_sens;	    	    if (SCHEME_EOFP(v)) {	      scheme_read_err(port, stxsrc, line, col, pos, 2, EOF, indentation,			      "read: end-of-file after #c%c",			      sens ? 's' : 'i');	      return NULL;	    }	    return v;	  }	  break;	case 's':	case 'S':	  ch = scheme_getc_special_ok(port);	  if ((ch == 'x') || (ch == 'X')) {	    ReadParams params_copy;	    Scheme_Object *v;	    memcpy(&params_copy, params, sizeof(ReadParams));	    params_copy.honu_mode = 0;	    v = read_inner(port, stxsrc, ht, indentation, &params_copy, 0);	    if (SCHEME_EOFP(v)) {	      scheme_read_err(port, stxsrc, line, col, pos, 2, EOF, indentation,			      "read: end-of-file after #sx");	      return NULL;	    }	    return v;	  } else {	    scheme_read_err(port, stxsrc, line, col, pos, SPAN(port, pos), ch, indentation,			    "read: expected `x' after `#s'");	    return NULL;	  }	case 'X':	case 'x': 	  if (!params->honu_mode) {	    return read_number(-1, port, stxsrc, line, col, pos, 0, 0, 16, 1, ht, indentation, params, table);	  }	  break;	case 'B':	case 'b': 	  if (!params->honu_mode) {	    return read_number(-1, port, stxsrc, line, col, pos, 0, 0, 2, 1, ht, indentation, params, table);	  }	  break;	case 'O':	case 'o': 	  if (!params->honu_mode) {	    return read_number(-1, port, stxsrc, line, col, pos, 0, 0, 8, 1, ht, indentation, params, table);	  }	  break;	case 'D':	case 'd': 	  if (!params->honu_mode) {	    return read_number(-1, port, stxsrc, line, col, pos, 0, 0, 10, 1, ht, indentation, params, table);	  }	  break;	case 'E':	case 'e': 	  if (!params->honu_mode) {	    return read_number(-1, port, stxsrc, line, col, pos, 0, 1, 10, 0, ht, indentation, params, table);	  }	  break;	case 'I':	case 'i': 	  if (!params->honu_mode) {	    return read_number(-1, port, stxsrc, line, col, pos, 1, 0, 10, 0, ht, indentation, params, table);	  }	  break;	case '\'':	  if (!params->honu_mode) {	    return read_quote("quoting #'", syntax_symbol, 2, port, stxsrc, line, col, pos, ht, indentation, params);	  }	  break;	case '`':	  if (!params->honu_mode) {	    return read_quote("quasiquoting #`", quasisyntax_symbol, 2, port, stxsrc, line, col, pos, ht, indentation, params);	  }	  break;	case ',':	  if (!params->honu_mode) {	    if (scheme_peekc_special_ok(port) == '@') {	      ch = scheme_getc(port); /* must be '@' */	      return read_quote("unquoting #`@", unsyntax_splicing_symbol, 3, port, stxsrc, line, col, pos, ht, indentation, params);	    } else	      return read_quote("unquoting #`", unsyntax_symbol, 2, port, stxsrc, line, col, pos, ht, indentation, params);	  }	  break;	case '~':	  if (!params->honu_mode) {	    if (params->can_read_compiled) {	      Scheme_Object *cpld;	      cpld = read_compiled(port, ht);	      if (stxsrc)		cpld = scheme_make_stx_w_offset(cpld, line, col, pos, SPAN(port, pos), stxsrc, STX_SRCTAG);	      return cpld;	    } else {	      scheme_read_err(port, stxsrc, line, col, pos, 2, 0, indentation,			      "read: #~ compiled expressions not currently enabled");	      return NULL;	    }	  }	  break;	case '|':	  if (!params->honu_mode) {	    /* FIXME: integer overflow possible */	    depth = 0;	    ch2 = 0;	    do {	      ch = scheme_getc_special_ok(port);	      if (ch == EOF)		scheme_read_err(port, stxsrc, line, col, pos, SPAN(port, pos), EOF, indentation,				"read: end of file in #| comment");	      else if (ch == SCHEME_SPECIAL)		scheme_get_ready_read_special(port, stxsrc, ht);	      if ((ch2 == '|') && (ch == '#')) {		if (!(depth--)) {		  if ((table && (comment_mode & RETURN_FOR_SPECIAL_COMMENT))		      || (comment_mode & RETURN_FOR_COMMENT))		    return NULL;		  goto start_over;		}	      } else if ((ch2 == '#') && (ch == '|')) {		depth++;		ch = 0; /* So we don't count '|' toward a closing "|#" */	      }	      ch2 = ch;	    } while (1);	  }	  break;	case '&':	  if (!params->honu_mode) {	    if (params->can_read_box)	      return read_box(port, stxsrc, line, col, pos, ht, indentation, params);	    else {	      scheme_read_err(port, stxsrc, line, col, pos, 2, 0, indentation,			      "read: #& expressions not currently enabled");	      return NULL;	    }	  }	  break;	case 'r':	  if (!params->honu_mode) {	    int cnt = 0, is_byte = 0;	    char *expect;	    ch = scheme_getc_special_ok(port);	    if (ch == 'x') {	      expect = "x#";	      ch = scheme_getc_special_ok(port);	      cnt++;	      if (ch == '#') {		is_byte = 1;		cnt++;		ch = scheme_getc_special_ok(port);	      }	      if (ch == '"') {		Scheme_Object *str;		int is_err;		/* Skip #rx[#]: */		scheme_tell_all(port, &line, &col, &pos);		str = read_string(is_byte, 0, port, stxsrc, line, col, pos, ht, indentation, params);		if (stxsrc)		  str = SCHEME_STX_VAL(str);		str = scheme_make_regexp(str, is_byte, &is_err);		if (is_err) {		  scheme_read_err(port, stxsrc, line, col, pos, 2, 0, indentation,				  "read: bad regexp string: %s", (char *)str);		  return NULL;		}		if (stxsrc)		  str = scheme_make_stx_w_offset(str, line, col, pos, SPAN(port, pos), stxsrc, STX_SRCTAG);		return str;	      }	    } else if (ch == 'e') {	      expect = "eader";	      cnt++;	      while (expect[cnt]) {		ch = scheme_getc_special_ok(port);		if (ch != expect[cnt])		  break;		cnt++;	      }	      if (!expect[cnt]) {		/* Found #reader. Read an S-exp. */		Scheme_Object *v;		if (!params->can_read_reader) {		  scheme_read_err(port, stxsrc, line, col, pos, 7, 0, indentation,				  "read: #reader expressions not currently enabled");		  return NULL;		}		v = read_reader(port, stxsrc, line, col, pos, ht, indentation, params);		if (!v) {		  if (comment_mode & RETURN_FOR_SPECIAL_COMMENT)		    return NULL;		  goto start_over;		}		return v;	      }	    } else	      expect = "";	    {	      mzchar a[6];	      int i;	      for (i = 0; i < cnt; i++) {		a[i] = expect[i];	      }	      if (NOT_EOF_OR_SPECIAL(ch)) {		a[cnt++] = ch;	      }	      scheme_read_err(port, stxsrc, line, col, pos, SPAN(port, pos),			      ch, indentation,			      "read: bad syntax `#r%u'",			      a, cnt);	      return NULL;	    }	  }	  break;	case 'h':	  {	    int honu = 0;	    ch = scheme_getc_special_ok(port);	    switch ( ch ) {	    case 'a':	      honu = 0;	      break;	    case 'o':	      honu = -1;	      break;	    case 'x':	      honu = 1;	      break;	    default:	      if (!params->honu_mode) {		scheme_read_err(port, stxsrc, line, col, pos, 2, ch, indentation,				"read: expected `a', `u', or `o' after #h");		return NULL;	      }	      honu = 0;	      break;	    }	    if (params->honu_mode && (honu != 1)) {	      scheme_read_err(port, stxsrc, line, col, pos, 2, ch, indentation,			      "read: expected `x' after #h");	      return NULL;	    }	    if (honu) {	      ReadParams params_copy;	      Scheme_Object *v;	      if (honu == -1) {		/* Check for "nu", still */		ch = scheme_getc_special_ok(port);		if (ch == 'n') {		  ch = scheme_getc_special_ok(port);		  if (ch == 'u') {		    /* Done */		  } else		    scheme_read_err(port, stxsrc, line, col, pos, 4, ch, indentation,				    "read: expected `u' after #hon");		} else		  scheme_read_err(port, stxsrc, line, col, pos, 3, ch, indentation,			      "read: expected `nu' after #ho");	      }	      memcpy(&params_copy, params, sizeof(ReadParams));	      params_copy.honu_mode = 1;	      if (honu == 1) {		v = read_inner(port, stxsrc, ht, indentation, params, 0);		if (SCHEME_EOFP(v)) {		  scheme_read_err(port, stxsrc, line, col, pos, 2, EOF, indentation,				  "read: end-of-file after #hx");		  return NULL;		}	      } else		v = read_list(port, stxsrc, line, col, pos, EOF, mz_shape_cons, 0, ht, indentation, params);	      return v;	    } else {	      GC_CAN_IGNORE const mzchar str[] = { 's', 'h', 'e', 'q', 0 };	      int scanpos = 0, failed = 0;	      do {		ch = scheme_getc_special_ok(port);		if ((mzchar)ch == str[scanpos]) {		  scanpos++;		} else {		  if (scanpos == 2) {		    if (!(ch == '(')			&& ! (ch == '[' && params->square_brackets_are_parens)			&& !(ch == '{' && params->curly_braces_are_parens))		      failed = 1;		  } else		    failed = 1;		  break;		}	      } while (str[scanpos]);	      if (!failed) {		/* Found recognized tag. Look for open paren... */		if (scanpos > 2)		  ch = scheme_getc_special_ok(port);		if (ch == '(')		  return read_hash(port, stxsrc, line, col, pos, ')', (scanpos == 4), ht, indentation, params);		if (ch == '[' && params->square_brackets_are_parens)		  return read_hash(port, stxsrc, line, col, pos, ']', (scanpos == 4), ht, indentation, params);		if (ch == '{' && params->curly_braces_are_parens)		  return read_hash(port, stxsrc, line, col, pos, '}', (scanpos == 4), ht, indentation, params);	      }	      /* Report an error. So far, we read 'ha', then scanpos chars of str, then ch. */	      {		mzchar str_part[7], one_more[2];		memcpy(str_part, str, scanpos * sizeof(mzchar));		str_part[scanpos] = 0;		if (NOT_EOF_OR_SPECIAL(ch)) {		  one_more[0] = ch;		  one_more[1] = 0;		} else		  one_more[0] = 0;		scheme_read_err(port, stxsrc, line, col, pos, SPAN(port, pos),				ch, indentation,				"read: bad syntax `#ha%5%u'",				str_part,				one_more, NOT_EOF_OR_SPECIAL(ch) ? 1 : 0);		return NULL;	      }	    }	  }	  break;	case '"':	  if (!params->honu_mode) {	    return read_string(1, 0, port, stxsrc, line, col, pos, ht, indentation, params);	  }	  break;	case '<':	  if (!params->honu_mode) {	    if (scheme_peekc_special_ok(port) == '<') {	      /* Here-string */	      ch = scheme_getc_special_ok(port);	      return read_here_string(port, stxsrc, line, col, pos,indentation, params);	    } else {	      scheme_read_err(port, stxsrc, line, col, pos, 2, 0, indentation, "read: bad syntax `#<'");	      return NULL;	    }	  }	  break;	default:	  if (!params->honu_mode) {	    int vector_length = -1;	    int i = 0, j = 0, overflow = 0, digits = 0;	    mzchar tagbuf[64], vecbuf[64]; /* just for errors */	    while (NOT_EOF_OR_SPECIAL(ch) && isdigit_ascii(ch)) {	      if (digits <= MAX_GRAPH_ID_DIGITS)		digits++;	      /* For vector error msgs, want to drop leading zeros: */	      if (j || (ch != '0')) {		if (j < 60) {		  vecbuf[j++] = ch;		} else if (j == 60) {		  vecbuf[j++] = '.';		  vecbuf[j++] = '.';		  vecbuf[j++] = '.';		  vecbuf[j] = 0;		}	      }	      /* For tag error msgs, want to keep zeros: */	      if (i < 60) {		tagbuf[i++] = ch;	      } else if (i == 60) {		tagbuf[i++] = '.';		tagbuf[i++] = '.';		tagbuf[i++] = '.';		tagbuf[i] = 0;	      }	      if (!overflow) {		long old_len;		if (vector_length < 0)		  vector_length = 0;		old_len = vector_length;		vector_length = (vector_length * 10) + (ch - 48);		if ((vector_length < 0)|| ((vector_length / 10) != old_len)) {		  overflow = 1;		}	      }	      ch = scheme_getc_special_ok(port);	    }	    if (overflow)	      vector_length = -2;	    vecbuf[j] = 0;	    tagbuf[i] = 0;	    if (ch == '(')	      return read_vector(port, stxsrc, line, col, pos, ')', vector_length, vecbuf, ht, indentation, params);	    if (ch == '[' && params->square_brackets_are_parens)	      return read_vector(port, stxsrc, line, col, pos, ']', vector_length, vecbuf, ht, indentation, params);	    if (ch == '{' && params->curly_braces_are_parens)	      return read_vector(port, stxsrc, line, col, pos, '}', vector_length, vecbuf, ht, indentation, params);	    if (ch == '#' && (vector_length != -1)) {	      /* Not a vector after all: a graph reference */	      Scheme_Object *ph;	      if (!params->can_read_graph)		scheme_read_err(port, stxsrc, line, col, pos, SPAN(port, pos), 0, indentation,				"read: #..# expressions not currently enabled");	      if (digits > MAX_GRAPH_ID_DIGITS)		scheme_read_err(port, stxsrc, line, col, pos, SPAN(port, pos), 0, indentation,				"read: graph id too long in #%5#",				tagbuf);	      if (*ht)		ph = (Scheme_Object *)scheme_hash_get(*ht, scheme_make_integer(vector_length));	      else		ph = NULL;	      if (!ph) {		scheme_read_err(port, stxsrc, line, col, pos, SPAN(port, pos), 0, indentation,				"read: no #%ld= preceding #%ld#",				vector_length, vector_length);		return scheme_void;	      }	      return ph;	    }	    if (ch == '=' && (vector_length != -1)) {	      /* Not a vector after all: a graph definition */	      Scheme_Object *v, *ph;	      if (!params->can_read_graph)		scheme_read_err(port, stxsrc, line, col, pos, SPAN(port, pos), 0, indentation,				 "read: #..= expressions not currently enabled");	      if (digits > MAX_GRAPH_ID_DIGITS)		scheme_read_err(port, stxsrc, line, col, pos, SPAN(port, pos), 0, indentation,				 "read: graph id too long in #%s=",				 tagbuf);	      if (*ht) {		if (scheme_hash_get(*ht, scheme_make_integer(vector_length))) {		  scheme_read_err(port, stxsrc, line, col, pos, SPAN(port, pos), 0, indentation,				  "read: multiple #%ld= tags",				  vector_length);		  return NULL;		}	      } else {		Scheme_Hash_Table *tht;		tht = scheme_make_hash_table(SCHEME_hash_ptr);		*ht = tht;	      }	      ph = scheme_alloc_small_object();	      ph->type = scheme_placeholder_type;	      scheme_hash_set(*ht, scheme_make_integer(vector_length), (void *)ph);	      v = read_inner(port, stxsrc, ht, indentation, params, 0);	      if (SCHEME_EOFP(v))		scheme_read_err(port, stxsrc, line, col, pos, SPAN(port, pos), EOF, indentation,				"read: expected an element for graph (found end-of-file)");	      if (stxsrc && SCHEME_STXP(v)) /* might be a placeholder! */		v = scheme_make_graph_stx(v, line, col, pos);	      SCHEME_PTR_VAL(ph) = v;	      return v;	    }	    {	      char *lbuffer;	      int pch = ch, ulen, blen;	      if ((pch == EOF) || (pch == SCHEME_SPECIAL))		pch = 0;	      ulen = scheme_char_strlen(tagbuf);	      blen = scheme_utf8_encode_all(tagbuf, ulen, NULL);	      lbuffer = (char *)scheme_malloc_atomic(blen + MAX_UTF8_CHAR_BYTES + 1);	      scheme_utf8_encode_all(tagbuf, ulen, lbuffer);	      blen += scheme_utf8_encode(&pch, 0, 1,					 lbuffer, blen,					 0);	      lbuffer[blen] = 0;	      scheme_read_err(port, stxsrc, line, col, pos, SPAN(port, pos), ch, indentation,			      "read: bad syntax `#%s'",			      lbuffer);	      return NULL;	    }	  }	  break;	}      /* We get here only in honu mode */      scheme_read_err(port, stxsrc, line, col, pos, 2, ch, indentation,		      "read: bad syntax `#%c'",		      ch);      return NULL;      break;    case '/':      if (params->honu_mode) {	int ch2;	ch2 = scheme_peekc_special_ok(port);	if ((ch2 == '/') || (ch2 == '*')) {	  /* Comment */	  scheme_ungetc('/', port);	  ch = skip_whitespace_comments(port, stxsrc, ht, indentation, params);	  goto start_over_with_ch;	}      }      return read_symbol(ch, port, stxsrc, line, col, pos, ht, indentation, params, table);      break;    default:      if (isdigit_ascii(ch))	return read_number(ch, port, stxsrc, line, col, pos, 0, 0, 10, 0, ht, indentation, params, table);      else	return read_symbol(ch, port, stxsrc, line, col, pos, ht, indentation, params, table);    }}