mirror of
				https://github.com/cookiengineer/audacity
				synced 2025-11-04 08:04:06 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			246 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			246 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* -*- Mode: c; c-basic-offset: 2 -*-
 | 
						|
 *
 | 
						|
 * rdf_heuristics.c - Heuristic routines to guess things about RDF
 | 
						|
 *
 | 
						|
 * Copyright (C) 2000-2008, David Beckett http://www.dajobe.org/
 | 
						|
 * Copyright (C) 2000-2004, University of Bristol, UK http://www.bristol.ac.uk/
 | 
						|
 * 
 | 
						|
 * This package is Free Software and part of Redland http://librdf.org/
 | 
						|
 * 
 | 
						|
 * It is licensed under the following three licenses as alternatives:
 | 
						|
 *   1. GNU Lesser General Public License (LGPL) V2.1 or any newer version
 | 
						|
 *   2. GNU General Public License (GPL) V2 or any newer version
 | 
						|
 *   3. Apache License, V2.0 or any newer version
 | 
						|
 * 
 | 
						|
 * You may not use this file except in compliance with at least one of
 | 
						|
 * the above three licenses.
 | 
						|
 * 
 | 
						|
 * See LICENSE.html or LICENSE.txt at the top of this package for the
 | 
						|
 * complete terms and further detail along with the license texts for
 | 
						|
 * the licenses in COPYING.LIB, COPYING and LICENSE-2.0.txt respectively.
 | 
						|
 * 
 | 
						|
 * 
 | 
						|
 */
 | 
						|
 | 
						|
 | 
						|
#ifdef HAVE_CONFIG_H
 | 
						|
#include <rdf_config.h>
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef WIN32
 | 
						|
#include <win32_rdf_config.h>
 | 
						|
#endif
 | 
						|
 | 
						|
#include <stdio.h>
 | 
						|
#include <string.h>
 | 
						|
#include <stdarg.h>
 | 
						|
#include <ctype.h>
 | 
						|
 | 
						|
#ifdef HAVE_STDLIB_H
 | 
						|
#include <stdlib.h> /* for strtol */
 | 
						|
#endif
 | 
						|
 | 
						|
#include <redland.h>
 | 
						|
 | 
						|
 | 
						|
#ifndef STANDALONE
 | 
						|
/**
 | 
						|
 * librdf_heuristic_is_blank_node:
 | 
						|
 * @node: string object to guess type
 | 
						|
 *
 | 
						|
 * Try to guess if an node string is a blank node identifier.
 | 
						|
 *
 | 
						|
 * The guessing is done by assuming the object is a blank node if it matches
 | 
						|
 * ^_: like N-Triples, N3 and related.
 | 
						|
 *
 | 
						|
 * Return value: non 0 if node is probably a blank node identifier
 | 
						|
 **/
 | 
						|
 | 
						|
int
 | 
						|
librdf_heuristic_is_blank_node(const char *node)
 | 
						|
{
 | 
						|
  return node && (*node == '_' && node[1] == ':'); 
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * librdf_heuristic_get_blank_node:
 | 
						|
 * @node: string object to guess type
 | 
						|
 *
 | 
						|
 * Get a blank node identifier from a node string.
 | 
						|
 *
 | 
						|
 * Picks the blank node identifier out of a string.  Looks for things
 | 
						|
 * like _:ABC
 | 
						|
 *
 | 
						|
 * Return value: the blank node identifer string or NULL if the node does not seem to be a blank node identifier
 | 
						|
 **/
 | 
						|
 | 
						|
const char*
 | 
						|
librdf_heuristic_get_blank_node(const char *node)
 | 
						|
{
 | 
						|
  return librdf_heuristic_is_blank_node(node) ? node+2 : NULL;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * librdf_heuristic_object_is_literal:
 | 
						|
 * @object: string object to guess type
 | 
						|
 *
 | 
						|
 * Try to guess if an object string is a literal or a resource.
 | 
						|
 *
 | 
						|
 * The guessing is done by assuming the object is a URL if it matches
 | 
						|
 *   ^[isalnum()]+:[^isblank()]+$
 | 
						|
 *
 | 
						|
 * This will be fooled by literals of form 'thing:non-blank-thing' but
 | 
						|
 * is good enough.
 | 
						|
 * 
 | 
						|
 * Return value: non 0 if object is probably a literal
 | 
						|
 **/
 | 
						|
 | 
						|
int
 | 
						|
librdf_heuristic_object_is_literal(const char *object) 
 | 
						|
{
 | 
						|
  int object_is_literal=1; /* assume the worst */
 | 
						|
 | 
						|
  if(librdf_heuristic_is_blank_node(object))
 | 
						|
    return 0;
 | 
						|
  
 | 
						|
  /* Find first non alphanumeric */
 | 
						|
  for(;*object; object++)
 | 
						|
    if(!isalnum(*object))
 | 
						|
       break;
 | 
						|
 | 
						|
  /* Better be a ':' */
 | 
						|
  if(*object && *object == ':') {
 | 
						|
    /* check rest of string has no spaces */
 | 
						|
    for(;*object; object++)
 | 
						|
      if(isspace(*object))
 | 
						|
        break;
 | 
						|
 | 
						|
    /* reached end, not a literal (by this heuristic) */
 | 
						|
    if(!*object)
 | 
						|
      object_is_literal=0;
 | 
						|
  }
 | 
						|
  
 | 
						|
  return object_is_literal;
 | 
						|
 
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * librdf_heuristic_gen_name:
 | 
						|
 * @name: the name
 | 
						|
 *
 | 
						|
 * Generate a new name from an existing name.
 | 
						|
 * 
 | 
						|
 * Adds an integer or increases the integer at the end of the name
 | 
						|
 * in order to generate a new one
 | 
						|
 * 
 | 
						|
 * Return value: a new name or NULL on failure
 | 
						|
 **/
 | 
						|
char *
 | 
						|
librdf_heuristic_gen_name(const char *name) 
 | 
						|
{
 | 
						|
  char *new_name;
 | 
						|
  const char *p=name;
 | 
						|
  size_t len;
 | 
						|
  size_t offset;
 | 
						|
  long l=-1L;
 | 
						|
  
 | 
						|
  LIBRDF_ASSERT_OBJECT_POINTER_RETURN_VALUE(name, cstring, NULL);
 | 
						|
 | 
						|
  /* Move to last character of name */
 | 
						|
  len=strlen(name);
 | 
						|
  offset=len-1;
 | 
						|
  p=name+offset;
 | 
						|
 | 
						|
  /* Move p to last non number char */
 | 
						|
  if(isdigit(*p)) {
 | 
						|
    while(p>name && isdigit(*p))
 | 
						|
      p--;
 | 
						|
    l=strtol(p+1, (char**)NULL, 10);
 | 
						|
    offset=p-name;
 | 
						|
  }
 | 
						|
   
 | 
						|
  if(l<0)
 | 
						|
    l=0;
 | 
						|
  l++;
 | 
						|
 | 
						|
  /* +1 to required length if no digit was found */
 | 
						|
  if(offset == len-1) 
 | 
						|
    len++;
 | 
						|
 | 
						|
  /* +1 to required length if an extra digit is needed -
 | 
						|
   * number now ends in 0.  Note l is never 0. */
 | 
						|
  if((l % 10) ==0) 
 | 
						|
    len++;
 | 
						|
 | 
						|
  new_name=(char*)LIBRDF_MALLOC(cstring, len+1); /* +1 for \0 */
 | 
						|
  strncpy(new_name, name, offset+2);
 | 
						|
  sprintf(new_name+offset+1, "%ld", l);
 | 
						|
  return new_name;
 | 
						|
}
 | 
						|
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
/* TEST CODE */
 | 
						|
 | 
						|
 | 
						|
#ifdef STANDALONE
 | 
						|
 | 
						|
/* one more prototype */
 | 
						|
int main(int argc, char *argv[]);
 | 
						|
 | 
						|
 | 
						|
int
 | 
						|
main(int argc, char *argv[]) 
 | 
						|
{
 | 
						|
  const char *test_names[]={"test", "abc123", "99997", NULL};
 | 
						|
  char *name;
 | 
						|
  int n;
 | 
						|
  int rc=0;
 | 
						|
  
 | 
						|
#define NAMES_COUNT 11
 | 
						|
 | 
						|
  const char *program=librdf_basename((const char*)argv[0]);
 | 
						|
 | 
						|
  for(n=0; (name=(char*)test_names[n]); n++) {
 | 
						|
    int i;
 | 
						|
    
 | 
						|
#if LIBRDF_DEBUG > 1
 | 
						|
    fprintf(stdout, "%s: Generating %d new names from '%s'\n", program, 
 | 
						|
            NAMES_COUNT, name);
 | 
						|
#endif
 | 
						|
  
 | 
						|
    for(i=0; i< NAMES_COUNT; i++) {
 | 
						|
      char *new_name;
 | 
						|
      
 | 
						|
#if LIBRDF_DEBUG > 1
 | 
						|
      fprintf(stdout, "Generating name from '%s'\n", name);
 | 
						|
#endif
 | 
						|
      new_name=librdf_heuristic_gen_name(name);
 | 
						|
      if(!new_name) {
 | 
						|
        fprintf(stdout, "%s: Failed to generate name from '%s'\n", program, name);
 | 
						|
        rc=1;
 | 
						|
        break;
 | 
						|
      }
 | 
						|
#if LIBRDF_DEBUG > 1
 | 
						|
      fprintf(stdout, "  result was '%s'\n", new_name);
 | 
						|
#endif
 | 
						|
      
 | 
						|
      if(name != test_names[n])
 | 
						|
        LIBRDF_FREE(cstring, (char*)name);
 | 
						|
      /* copy them over */
 | 
						|
      name=new_name;
 | 
						|
    }
 | 
						|
 | 
						|
    if(name != test_names[n])
 | 
						|
      LIBRDF_FREE(cstring, name);
 | 
						|
  }
 | 
						|
 | 
						|
  return rc;
 | 
						|
}
 | 
						|
 | 
						|
#endif
 |