Ejemplo n.º 1
0
int main()
 //@ requires true;
 //@ ensures true;
{
	struct tokenizer* tokenizer = tokenizer_create(my_getchar);

	for (;;)
		//@ invariant Tokenizer(tokenizer);
	{
		int result = tokenizer_next(tokenizer);
		if (result == -1) break;
		print_token(tokenizer);
	}
	
	tokenizer_dispose(tokenizer);

	puts("The end");
	return 0;
}
Ejemplo n.º 2
0
/**
 * Load an AS-level topology in the Subramanian et al format. The
 * file format is as follows. Each line describes a directed
 * relationship between a two ASes:
 *   <AS1-number> <AS2-number> <peering-type>
 * where peering type can be
 *   0 for a peer-to-peer relationship
 *   1 for a provider (AS1) to customer (AS2) relationship
 * A relationship among two ASes is described in one direction only.
 */
int rexford_parser(FILE * file, as_level_topo_t * topo,
		   int * line_number)
{
  char line[80];
  asn_t asn1, asn2;
  unsigned int relation;
  int error= 0;
  net_link_delay_t delay;
  gds_tokenizer_t * tokenizer;
  const gds_tokens_t * tokens;
  as_level_domain_t * domain1, * domain2;
  peer_type_t peer_type;

  *line_number= 0;

  // Parse input file
  tokenizer= tokenizer_create(" \t", NULL, NULL);
  
  while ((!feof(file)) && (!error)) {
    if (fgets(line, sizeof(line), file) == NULL)
      break;
    (*line_number)++;
    
    // Skip comments starting with '#'
    if (line[0] == '#')
      continue;
    
    if (tokenizer_run(tokenizer, line) != TOKENIZER_SUCCESS) {
      error= ASLEVEL_ERROR_UNEXPECTED;
      break;
    }
    
    tokens= tokenizer_get_tokens(tokenizer);
    
    // Set default value for optional parameters
    delay= 0;
    
    // Get and check mandatory parameters
    if (tokens_get_num(tokens) < 3) {
      error= ASLEVEL_ERROR_NUM_PARAMS;
      break;
    }

    // Get and check ASNs
    if (str2asn(tokens_get_string_at(tokens, 0), &asn1) ||
	str2asn(tokens_get_string_at(tokens, 1), &asn2)) {
      error= ASLEVEL_ERROR_INVALID_ASNUM;
      break;
    }
    
    // Get and check business relationship
    if ((tokens_get_uint_at(tokens, 2, &relation) != 0) ||
	(_rexford_relation_to_peer_type(relation, &peer_type) != 0)) {
      error= ASLEVEL_ERROR_INVALID_RELATION;
      break;
    }
    
    // Get optional parameters
    if (tokens_get_num(tokens) > 3) {
      if (str2delay(tokens_get_string_at(tokens, 3), &delay)) {
	error= ASLEVEL_ERROR_INVALID_DELAY;
	break;
      }
    }
    
    // Limit number of parameters
    if (tokens_get_num(tokens) > 4) {
      STREAM_ERR(STREAM_LEVEL_SEVERE,
	      "Error: too many arguments in topology, line %u\n",
	      *line_number);
      error= ASLEVEL_ERROR_NUM_PARAMS;
      break;
    }
    
    // Add/get domain 1
    if (!(domain1= aslevel_topo_get_as(topo, asn1)) &&
	!(domain1= aslevel_topo_add_as(topo, asn1))) {
      error= ASLEVEL_ERROR_UNEXPECTED;
      break;
    }
    
    // Add/get domain 2
    if (!(domain2= aslevel_topo_get_as(topo, asn2)) &&
	!(domain2= aslevel_topo_add_as(topo, asn2))) {
      error= ASLEVEL_ERROR_UNEXPECTED;
      break;
    }
    
    // Add link in both directions
    error= aslevel_as_add_link(domain1, domain2, peer_type, NULL);
    if (error != ASLEVEL_SUCCESS)
      break;
    peer_type= aslevel_reverse_relation(peer_type);
    error= aslevel_as_add_link(domain2, domain1, peer_type, NULL);
    if (error != ASLEVEL_SUCCESS)
      break;
    
  }

  tokenizer_destroy(&tokenizer);
  return error;
}