if (ch == EOF) { lr->token.tok = tok_eof; return &lr->token; };
lr_token (struct linereader *lr, const struct charset_t *charset){  int ch;  while (1)    {      do	{	  ch = lr_getc (lr);	  if (ch == '\n')	    {	      lr->token.tok = tok_eol;	      return &lr->token;	    }	}      while (isspace (ch));      if (ch == EOF)	{	  lr->token.tok = tok_eof;	  return &lr->token;	};      if (ch != lr->comment_char)	break;      /* Ignore rest of line.  */      lr_ignore_rest (lr, 0);      lr->token.tok = tok_eol;      return &lr->token;    }  /* Match escape sequences.  */  if (ch == lr->escape_char)    return get_toplvl_escape (lr);  /* Match ellipsis.  */  if (ch == '.' && strncmp (&lr->buf[lr->idx], "..", 2) == 0)    {      lr_getc (lr);      lr_getc (lr);      lr->token.tok = tok_ellipsis;      return &lr->token;    }  switch (ch)    {    case '<':      return get_symname (lr);    case '0' ... '9':      lr->token.tok = tok_number;      lr->token.val.num = ch - '0';      while (isdigit (ch = lr_getc (lr)))	{	  lr->token.val.num *= 10;	  lr->token.val.num += ch - '0';	}      if (isalpha (ch))	lr_error (lr, _("garbage at end of number"));      lr_ungetn (lr, 1);      return &lr->token;    case ';':      lr->token.tok = tok_semicolon;      return &lr->token;    case ',':      lr->token.tok = tok_comma;      return &lr->token;    case '(':      lr->token.tok = tok_open_brace;      return &lr->token;    case ')':      lr->token.tok = tok_close_brace;      return &lr->token;    case '"':      return get_string (lr, charset);    case '-':      ch = lr_getc (lr);      if (ch == '1')	{	  lr->token.tok = tok_minus1;	  return &lr->token;	}      lr_ungetn (lr, 2);      break;    }  return get_ident (lr);}