/* egg_getc:
 *  Reads the next byte of the input stream, applying some bodges.
 */
static int egg_getc()
{
   int c = do_getc();

   if ((c >= 'A') && (c <= 'Z'))
      c = c - 'A' + 'a';

   if (c == '#') {
      while ((c != '\n') && (c != EOF))
	 c = do_getc();
   }

   if (c == '\n')
      egg_line++;

   return c;
}
예제 #2
0
static
int read_offsets(dsk_data_t *data)
{
  long idx;
  int a, acyl, asid, lcyl, lsid, lsec, llen, c, count;

  idx = 0;
  data->len = 0;
  while (242)
    {
      acyl = do_getc(data); idx++; if (acyl == EOF) return 0;
      asid = do_getc(data); idx++; if (asid == EOF) return -1;
      lcyl = do_getc(data); idx++; if (lcyl == EOF) return -1;
      lsid = do_getc(data); idx++; if (lsid == EOF) return -1;
      lsec = do_getc(data); idx++; if (lsec == EOF) return -1;
      llen = do_getc(data); idx++; if (llen == EOF) return -1;
      c    = do_getc(data); idx++; if (c    == EOF) return -1;
      count = c;
      c    = do_getc(data); idx++; if (c    == EOF) return -1;
      count |= (c << 8);

      data->offset[data->len].head     = lsid;
      data->offset[data->len].cylinder = lcyl;
      data->offset[data->len].sector   = lsec;
      data->offset[data->len].count    = count;
      data->offset[data->len].offset   = idx;

      data->len++;

      for (a = 0;a < count;a++)
        {
          c = do_getc(data);
          idx++;
          if (c == EOF)
	    return -1;
        }
    }

}
예제 #3
0
/* Copies stdin to stdout, performing substitutions.  */
static void
subst_from_stdin (void)
{
  static char *buffer;
  static size_t bufmax;
  static size_t buflen;
  int c;

  for (;;)
    {
      c = do_getc ();
      if (c == EOF)
	break;
      /* Look for $VARIABLE or ${VARIABLE}.  */
      if (c == '$')
	{
	  unsigned short int opening_brace = 0;
	  unsigned short int closing_brace = 0;

	  c = do_getc ();
	  if (c == '{')
	    {
	      opening_brace = 1;
	      c = do_getc ();
	    }
	  if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '_')
	    {
	      unsigned short int valid;

	      /* Accumulate the VARIABLE in buffer.  */
	      buflen = 0;
	      do
		{
		  if (buflen >= bufmax)
		    {
		      bufmax = 2 * bufmax + 10;
		      buffer = xrealloc (buffer, bufmax);
		    }
		  buffer[buflen++] = c;

		  c = do_getc ();
		}
	      while ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')
		     || (c >= '0' && c <= '9') || c == '_');

	      if (opening_brace)
		{
		  if (c == '}')
		    {
		      closing_brace = 1;
		      valid = 1;
		    }
		  else
		    {
		      valid = 0;
		      do_ungetc (c);
		    }
		}
	      else
		{
		  valid = 1;
		  do_ungetc (c);
		}

	      if (valid)
		{
		  /* Terminate the variable in the buffer.  */
		  if (buflen >= bufmax)
		    {
		      bufmax = 2 * bufmax + 10;
		      buffer = xrealloc (buffer, bufmax);
		    }
		  buffer[buflen] = '\0';

		  /* Test whether the variable shall be substituted.  */
		  if (!all_variables
		      && !sorted_string_list_member (&variables_set, buffer))
		    valid = 0;
		}

	      if (valid)
		{
		  /* Substitute the variable's value from the environment.  */
		  const char *env_value = getenv (buffer);

		  if (env_value != NULL)
		    fputs (env_value, stdout);
		}
	      else
		{
		  /* Perform no substitution at all.  Since the buffered input
		     contains no other '$' than at the start, we can just
		     output all the buffered contents.  */
		  putchar ('$');
		  if (opening_brace)
		    putchar ('{');
		  fwrite (buffer, buflen, 1, stdout);
		  if (closing_brace)
		    putchar ('}');
		}
	    }
	  else
	    {
	      do_ungetc (c);
	      putchar ('$');
	      if (opening_brace)
		putchar ('{');
	    }
	}
      else
	putchar (c);
    }
}
예제 #4
0
/*
 * Reads and returns a character from the serial port
 *   - Times out after delay iterations checking for presence of character
 *   - Sets *error_p to UART error bits or - on timeout
 *   - On timeout, sets *error_p to -1 and returns 0
 */
char awaitkey(unsigned long delay, int* error_p)
{
	return (do_getc(NULL, delay, error_p));
}
예제 #5
0
파일: fgetc.c 프로젝트: bminor/musl
int fgetc(FILE *f)
{
	return do_getc(f);
}