OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [Open8 Tools/] [open8_src/] [open8_link/] [parse.c] - Rev 250

Go to most recent revision | Compare with Previous | Blame | View Log

 
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#include "defines.h"
 
 
 
int get_next_token(char *in, char *out, int *pos) {
 
  int i, t;
 
 
  /* skip white space */
  for (i = 0; in[i] == ' ' || in[i] == 0x09; i++);
  if (in[i] == 0)
    return FAILED;
 
  for (t = 0; in[i] != ' ' && in[i] != 0x09 && in[i] != 0; i++, t++)
    out[t] = in[i];
 
  out[t] = 0;
  *pos += i;
 
  return SUCCEEDED;
}
 
 
int get_next_number(char *in, int *out, int *pos) {
 
  int i, o, n;
 
 
  /* skip white space */
  for (i = 0; in[i] == ' ' || in[i] == 0x09; i++);
  if (in[i] == 0)
    return FAILED;
 
  if (in[i] >= '0' && in[i] <= '9') {
    /* is it hex after all? */
    n = 0;
    for (o = 0; 1; o++) {
      if (in[i+o] >= '0' && in[i+o] <= '9')
	continue;
      if (in[i+o] >= 'a' && in[i+o] <= 'f') {
	n = 1;
	break;
      }
      if (in[i+o] >= 'A' && in[i+o] <= 'F') {
	n = 1;
	break;
      }
      if (in[i+o] == 'h' || in[i+o] == 'H') {
	n = 1;
	break;
      }
      break;
    }
 
    if (n == 1) {
      /* hex */
      o = 0;
      while (TRUE) {
	if (in[i] >= '0' && in[i] <= '9')
	  o = (o * 16) + in[i] - '0';
	else if (in[i] >= 'a' && in[i] <= 'f')
	  o = (o * 16) + in[i] - 'a' + 0xA;
	else if (in[i] >= 'A' && in[i] <= 'F')
	  o = (o * 16) + in[i] - 'A' + 0xA;
	else if (in[i] == 'h' || in[i] == 'H')
	  break;
	else if (in[i] == ' ' || in[i] == 0x09 || in[i] == 0)
	  break;
	else
	  return FAILED;
	i++;
      }
    }
    else {
      /* decimal */
      for (o = 0; in[i] >= '0' && in[i] <= '9'; i++)
	o = (o * 10) + in[i] - '0';
      if (!(in[i] == ' ' || in[i] == 0x09 || in[i] == 0))
	return FAILED;
    }
  }
  else if (in[i] == '$') {
    i++;
    o = 0;
    while (TRUE) {
      if (in[i] >= '0' && in[i] <= '9')
	o = (o * 16) + in[i] - '0';
      else if (in[i] >= 'a' && in[i] <= 'f')
	o = (o * 16) + in[i] - 'a' + 0xA;
      else if (in[i] >= 'A' && in[i] <= 'F')
	o = (o * 16) + in[i] - 'A' + 0xA;
      else if (in[i] == ' ' || in[i] == 0x09 || in[i] == 0)
	break;
      else
	return FAILED;
      i++;
    }
  }
  else
    return FAILED;
 
  *out = o;
  *pos += i;
 
  return SUCCEEDED;
}
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.