예제 #1
0
파일: memory.c 프로젝트: snua12/zlomekfs
bool stringeq(string * str1, string * str2)
{
	if (stringlen(str1) != stringlen(str2))
		return false;

	return (strcmp(str1->str, str2->str) == 0);
}
예제 #2
0
bool ScanParseSkel::verifyHeader(const Char8 *szHeader)
{
    bool returnValue = true;

    if(szHeader == NULL)
    {
        SLOG << "Error Null Header String Read" << std::endl;
        return false;
    }

    if(_szReferenceHeader != NULL)
    {
        if(strncmp(szHeader,
                   _szReferenceHeader,
                   stringlen(_szReferenceHeader)) != 0)
        {
            SLOG << "Error : Header [" << szHeader << "] does not "
                    << "match reference [" << _szReferenceHeader << "]"
                    << std::endl;

            returnValue = false;
        }
    }
    else
    {
        SLOG << "Error Null Reference Header, Check disabled " << std::endl;
        return true;
    }

    return returnValue;
}
예제 #3
0
char*
mlstring2cstring_malloc(string mlstring)
{
	int size = stringlen(mlstring) + 1;
	char* buf = (char*)emalloc_atomic(size);
	return mlstring2cstring_buffer(mlstring, size, buf);
}
int count_word_in_str_way_1(char *str, char *word){
	if (str == NULL)return(0);
	int i = 0, j = 0, compare = 0, count = 0;
	int l = stringlen(word);
	while (str[i] != '\0'){
		if (str[i] == word[j]){
			compare++;
			if (compare == l){
				count++;
				j = 0;
				compare = 0;
				if (str[i] != word[j] || l == 1){
					i++;
				}
			}
			else{
				i++;
				j++;
			}
		}
		else{
			j = 0;
			compare = 0;
			i++;
		}
	}
	return count;
}
예제 #5
0
파일: strlen.c 프로젝트: liamweiland/lab_1
int main(){

  char str[] = "hello world";

  printf("The length of the string \"%s\" is %i\n",str, stringlen(str));

  return(0);
}
예제 #6
0
파일: 37.c 프로젝트: noparkinghere/C_test
/*************************************************
	Function: 		MirrorStr
	Description: 	查看是否对称
	Calls: 			
	Called By:		main
	Input: 			无
	Output: 		无
	Return: 		0
*************************************************/
bool MirrorStr(char *str)
{
	int i, j;
	for (i = 0, j = stringlen(str) - 1; i < j; i++, j--)
	{
		if (str[i] != str[j])
			return false;
	}
	return true;
}
예제 #7
0
int main( void ) 
{ 
    char string[ 80 ]; /* create char array */
 
    printf( "Enter a string: "); 
    scanf( "%[^\n]", string ); 
    printf( "%d\n", stringlen( string ) ); 

    return 0; 
}
예제 #8
0
파일: quiz.c 프로젝트: juliamann/CS50
int main(void)
{
	//printf("Give me a word: \n");
	string word = "hello";
	printf("Your word is %s\n", word);

	//stringlen(word);
	printf("The word is %d characters long.\n", stringlen(word));
	return 0;
}
/* Function adds a node to the list */
int add_node(List **list, char *content)
{
  char *copy_of_str;
  int string_len;
 
  List *node;   /* Declaring new ptr to List; ptr will hold addr of our new node */
  List *last;

  /* Allocate enough space in memory to hold new node */
  node = malloc(sizeof(List));
  if(node == NULL) /* If malloc function fails, raise an error */
    return (1);
  /* Copy content given as a parameter into a newly allocated space in memory */
  string_len = stringlen(content);
  copy_of_str = malloc(sizeof(char) * string_len); /* Allocate enough memory to store copy */
  /* COMMENTED OUT
     if(copy_of_str == NULL)                                         
     return NULL; 
   */
  copy_of_str = strcopy(copy_of_str, content);
  
  /* Initialize all the data of the new node.
     2nd node's str element holds the pointer to the newly allocated & 
     stored string (&copy_of_str)
  */
  node->str = copy_of_str;
  /* Make ptr 'next' of node point to NULL,                                        
     so the node will now be the last node of our list 
  */
  node->next = NULL;
  /* Make the 1st node (list) 'next' ptr point to the first element of 
     2nd node (by accessing its addr).
     If statement: assigns node location to *list if it is the first node 
     added to the list
  */ 
  if(*list == NULL)
    {
      *list = node;
    }
    /* Find the last node and designate the new node to follow.
    find_last_node takes the pointer to the front of the list;
    continues to next pointer in each node in the list until reaching 
    a NULL pointer. 
    */
  else 
    {
      last = *list; /* Last pointer points to the front/beginning of the list */
      while(last->next != NULL)
	{
	  last = last->next; /* We want last->next to point to nothing (NULL) */
	}
      last->next = node;
    }
  return(0);
}
예제 #10
0
char*
mlstring2cstring_buffer(string mlstring, int bufsize, char* buf)
{
	int bytelen = stringlen(mlstring);
	char *raw = stringbuf(mlstring);
	if((bytelen+1) > bufsize)
		DIE("buffer too small for string");
	memcpy(buf,raw,bytelen);
	buf[bytelen] = 0;
	return buf;
}
예제 #11
0
//decode function 'decipher'
//input... (&a, plain_text)
//output... plain_text: HELLO WORLD
char* decipher(const CipherText* cipher){
    int length = stringlen(cipher->text);
    char* text = malloc(sizeof(char)*(length + 1));
    if(text == NULL){
        return NULL;
    }
    for(i = 0; i < length; i++){
        text[i] = cipher->text[i] - cipher->shift;
    }
    text[length] = 0;
    return text;
}
예제 #12
0
/* Returns 0 if successful, error code on error. */
static int
termioset(struct termios* termios, ptr_t termiorep, string cc)
{
	memset(termios,0,sizeof(struct termios));
	termios->c_iflag = termiorep[0];
	termios->c_oflag = termiorep[1];
	termios->c_cflag = termiorep[2];
	termios->c_lflag = termiorep[3];
	assert(stringlen(cc) == NCCS);
	memcpy(termios->c_cc, stringbuf(cc), NCCS);
	if(cfsetispeed(termios, termiorep[5]) == -1)
		return errno;
	if(cfsetospeed(termios, termiorep[6]) == -1)
		return errno;
	return 0;
}
예제 #13
0
//coding function 'cipher'
//input... ("HELLO WORLD", 3, &a)
//output... &a->text: KHOOR#ZRUOG
int cipher(const char* plain_text, int shift, CipherText* ioCipher){
    ioCipher->shift = shift;
    int length = stringlen(plain_text);
    if(ioCipher->text != NULL){
        free(ioCipher->text);
    }
    ioCipher->text = malloc(sizeof(char)*(length+1));
    if(ioCipher->text == NULL){
        return 0;
    }
    for(i = 0; i < length; i++){
        ioCipher->text[i] = plain_text[i] + ioCipher->shift;
    }
    ioCipher->text[length] = 0;
    return 1;
}
예제 #14
0
int 
main (int argc, char *argv[])
{ int arg, ct, ne, ns, **table, e, s, t;
  fsa testfsa, copyfsa;
  char inf[100],outf[100],fsaname[100];
  boolean all_accepting=FALSE;
  boolean all_initial = FALSE;
  boolean deleting, deleting_s;
  storage_type ip_store = DENSE;
  boolean op_format_set = FALSE;
  storage_type op_format = DENSE;

  setbuf(stdout,(char*)0);
  setbuf(stderr,(char*)0);

  inf[0] = '\0';
  arg = 1;
  while (argc > arg) {
    if (strcmp(argv[arg],"-ip")==0) {
      arg++;
      if (arg >= argc)
        badusage();
      if (strcmp(argv[arg],"d")==0)
        ip_store = DENSE;
      else if (argv[arg][0] == 's')
        ip_store = SPARSE;
      else
        badusage();
    }
    else if (strcmp(argv[arg],"-op")==0) {
      arg++;
      op_format_set=TRUE;
      if (arg >= argc)
        badusage();
      if (strcmp(argv[arg],"d")==0)
        op_format = DENSE;
      else if (strcmp(argv[arg],"s")==0)
        op_format = SPARSE;
      else
        badusage();
    }
    else if (strcmp(argv[arg],"-a")==0)
      all_accepting = TRUE;
    else if (strcmp(argv[arg],"-i")==0)
      all_initial = TRUE;
    else if (strcmp(argv[arg],"-silent")==0)
      kbm_print_level = 0;
    else if (strcmp(argv[arg],"-v")==0)
      kbm_print_level = 2;
    else if (strcmp(argv[arg],"-vv")==0)
      kbm_print_level = 3;
    else {
       if (argv[arg][0] == '-')
         badusage();
       if (strcmp(inf,""))
         badusage();
       strcpy(inf,argv[arg]);
    }
    arg++;
  }
  if (stringlen(inf)!=0) {
    strcpy(outf,inf);
    if (all_initial)
      strcat(outf,".iprune");
    else
      strcat(outf,".prune");

    if ((rfile = fopen(inf,"r")) == 0) {
      fprintf(stderr,"Cannot open file %s.\n",inf);
      exit(1);
    }
  }
  else
    rfile = stdin;

  fsa_read(rfile,&testfsa,ip_store,0,0,TRUE,fsaname);
  if (stringlen(inf))
    fclose(rfile);

  ns = testfsa.states->size;
  ne = testfsa.alphabet->size;
  if (all_accepting) {
    tfree(testfsa.accepting);
    testfsa.num_accepting = ns;
  }
  all_accepting = testfsa.num_accepting == ns;

  /* The state deletions may destroy various properties of the automata */
  testfsa.flags[MINIMIZED]=FALSE;
  testfsa.flags[BFS]=FALSE;
  testfsa.flags[ACCESSIBLE]=FALSE;
  testfsa.flags[TRIM]=FALSE;

  if (all_initial) {
    table = testfsa.table->table_data_ptr;
    deleting=TRUE;
    while (deleting) {
      deleting=FALSE;
      for (s=1;s<=ns;s++) {
        /* if no transitions to state s delete it! */
        deleting_s=TRUE;
        for (e=1;e<=ne;e++) {
          if (!deleting_s)
            break;
          for (t=1;t<=ns;t++) {
            if (target(ip_store==DENSE,table,e,t,0)==s){
              deleting_s=FALSE;
              break;
            }
          }
        }
        if (deleting_s) {
          deleting=TRUE;
          if (kbm_print_level>1)
            printf("  #Deleting state number %d\n",s);
          fsa_delete_state(&testfsa,s);
          ns--;
        }
      }
    }
  }
  else if (all_accepting) {
    table = testfsa.table->table_data_ptr;
    deleting=TRUE;
    while (deleting) {
      deleting=FALSE;
      for (s=ns;s>0;s--) {
        /* if no transitions from state s delete it! */
        deleting_s=TRUE;
        for (e=1;e<=ne;e++)
          if (target(ip_store==DENSE,table,e,s,0)!=0){
            deleting_s=FALSE;
            break;
          }
        if (deleting_s) {
          deleting=TRUE;
          if (kbm_print_level>1)
            printf("  #Deleting state number %d\n",s);
          fsa_delete_state(&testfsa,s);
          ns--;
        }
      }
    }
  }
  else {
    for (s=ns;s>=1;s--) {
      if (kbm_print_level>1 && s%100==0)
         printf("  #state=%d\n",s);
      fsa_copy(&copyfsa,&testfsa);
                /* necessary because fsa_count alters its argument */
      copyfsa.initial[1]=s;
      ct = fsa_count(&copyfsa);
      if (ct==-1) exit(1);
      if (ct!=-2) {
        if (kbm_print_level>1)
          printf("  #Deleting state number %d\n",s);
        fsa_delete_state(&testfsa,s);
      }
      fsa_clear(&copyfsa);
    }
  }

  if (op_format_set)
    testfsa.table->printing_format = op_format;
  strcat(fsaname,"_prune");

  if (stringlen(inf)!=0)
    wfile = fopen(outf,"w");
  else
    wfile = stdout;

  if (all_initial) {
    tfree(testfsa.initial);
    testfsa.num_initial=testfsa.states->size;
    testfsa.flags[DFA]=FALSE;
    testfsa.flags[MIDFA]=TRUE;
  }
  fsa_print(wfile,&testfsa,fsaname);

  if (stringlen(inf)!=0)
    fclose(wfile);
  if (wfile!=stdout && kbm_print_level>0)
    printf("#Pruned fsa with %d states computed.\n",testfsa.states->size);

  fsa_clear(&testfsa);
  exit(0);
}
예제 #15
0
int 
main (int argc, char *argv[])
{ int arg;
  fsa fsain, *fsastarnd, *fsastar;
  char inf[100], outf[100], fsaname[100], tempfilename[100];
  storage_type ip_store = DENSE;
  int dr = 0;
  storage_type op_store = DENSE;


  setbuf(stdout,(char*)0);
  setbuf(stderr,(char*)0);

  inf[0] = '\0';
  arg = 1;
  while (argc > arg) {
    if (strcmp(argv[arg],"-ip")==0) {
      arg++;
      if (arg >= argc)
        badusage_fsastar();
      if (strcmp(argv[arg],"d")==0)
        ip_store = DENSE;
      else if (argv[arg][0] == 's') {
        ip_store = SPARSE;
        if (stringlen(argv[arg]) > 1)
          dr = atoi(argv[arg]+1);
      }
      else
        badusage_fsastar();
    }
    else if (strcmp(argv[arg],"-op")==0) {
      arg++;
      if (arg >= argc)
        badusage_fsastar();
      if (strcmp(argv[arg],"d")==0)
        op_store = DENSE;
      else if (strcmp(argv[arg],"s")==0)
        op_store = SPARSE;
      else
        badusage_fsastar();
    }
    else if (strcmp(argv[arg],"-silent")==0)
      kbm_print_level = 0;
    else if (strcmp(argv[arg],"-v")==0)
      kbm_print_level = 2;
    else if (strcmp(argv[arg],"-vv")==0)
      kbm_print_level = 3;
    else {
       if (argv[arg][0] == '-')
         badusage_fsastar();
       if (strcmp(inf,""))
         badusage_fsastar();
       strcpy(inf,argv[arg]);
    }
    arg++;
  }
  if (stringlen(inf)==0)
    badusage_fsastar();
  strcpy(outf,inf);
  strcat(outf,".star");

  if ((rfile = fopen(inf,"r")) == 0) {
    fprintf(stderr,"Cannot open file %s.\n",inf);
    exit(1);
  }
  fsa_read(rfile,&fsain,ip_store,dr,0,TRUE,fsaname);
  fclose(rfile);
  
  fsastarnd = fsa_star(&fsain,TRUE);
  if (fsastarnd==0) exit(1);


  if (fsastarnd->flags[NFA]){
    strcpy(tempfilename,inf);
    strcat(tempfilename,"temp_mid_XXX");
    if (kbm_print_level>1)
      printf("  #Number of states of fsastar before determinimization = %d.\n",
        fsastarnd->states->size);
    fsastar =
        nfa_determinize(fsastarnd,op_store,TRUE,TRUE,FALSE,tempfilename);
    if (fsastar==0) exit(1);
    tfree(fsastarnd);
  }
  else {
    fsastar = fsastarnd;
    fsastar->table->printing_format = op_store;
  }
  if (kbm_print_level>1)
    printf("  #Number of states of fsastar before minimization = %d.\n",
      fsastar->states->size);
  if (fsa_minimize(fsastar)== -1) exit(1);
  if (kbm_print_level>1)
    printf("  #Number of states of fsastar after minimization = %d.\n",
      fsastar->states->size);

  strcat(fsaname,"_star");
  wfile = fopen(outf,"w");
  fsa_print(wfile,fsastar,fsaname);
  fclose(wfile);

  if (kbm_print_level>0)
    printf(
   "#\"Starred\" fsa with %d states computed.\n",fsastar->states->size);

  fsa_clear(fsastar);
  tfree(fsastar);

  exit(0);
}
예제 #16
0
int 
main (int argc, char *argv[])
{ int arg;
  fsa fsain, *midfadeterminize;
  char inf[100], outf[100], fsaname[100], tempfilename[100];
  storage_type ip_store = DENSE;
  int dr = 0;
  storage_type op_store = DENSE;


  setbuf(stdout,(char*)0);
  setbuf(stderr,(char*)0);

  inf[0] = '\0';
  outf[0] = '\0';
  arg = 1;
  while (argc > arg) {
    if (strcmp(argv[arg],"-ip")==0) {
      arg++;
      if (arg >= argc)
        badusage_midfadeterminize();
      if (strcmp(argv[arg],"d")==0)
        ip_store = DENSE;
      else if (argv[arg][0] == 's') {
        ip_store = SPARSE;
        if (stringlen(argv[arg]) > 1)
          dr = atoi(argv[arg]+1);
      }
      else
        badusage_midfadeterminize();
    }
    else if (strcmp(argv[arg],"-op")==0) {
      arg++;
      if (arg >= argc)
        badusage_midfadeterminize();
      if (strcmp(argv[arg],"d")==0)
        op_store = DENSE;
      else if (strcmp(argv[arg],"s")==0)
        op_store = SPARSE;
      else
        badusage_midfadeterminize();
    }
    else if (strcmp(argv[arg],"-silent")==0)
      kbm_print_level = 0;
    else if (strcmp(argv[arg],"-v")==0)
      kbm_print_level = 2;
    else if (strcmp(argv[arg],"-vv")==0)
      kbm_print_level = 3;
    else if (strcmp(argv[arg],"-l")==0)
      kbm_large = TRUE;
    else if (strcmp(argv[arg],"-h")==0)
      kbm_huge = TRUE;
    else {
       if (argv[arg][0] == '-')
         badusage_midfadeterminize();
       if (strcmp(inf,""))
         badusage_midfadeterminize();
       strcpy(inf,argv[arg]);
    }
    arg++;
  }
  if (stringlen(inf)!=0) {
    strcpy(outf,inf);
    strcat(outf,".midfadeterminize");

    if ((rfile = fopen(inf,"r")) == 0) {
      fprintf(stderr,"Cannot open file %s.\n",inf);
      exit(1);
    }
  }
  else
    rfile = stdin;
  fsa_read(rfile,&fsain,ip_store,dr,0,TRUE,fsaname);
  if (stringlen(inf)!=0)
    fclose(rfile);

  strcpy(tempfilename,inf);
  strcat(tempfilename,"temp_mid_XXX");
  midfadeterminize = midfa_determinize(&fsain,op_store,TRUE,tempfilename);
  if (midfadeterminize==0) exit(1);

  fsa_clear(&fsain);

  if (kbm_print_level>1)
   printf("  #Number of states of midfadeterminize before minimisation = %d.\n",
        midfadeterminize->states->size);
  if (fsa_minimize(midfadeterminize)== -1) exit(1);
  if (kbm_print_level>1)
    printf("  #Number of states of midfadeterminize after minimisation = %d.\n",
        midfadeterminize->states->size);

  strcat(fsaname,"_midfadeterminize");

  if (stringlen(inf)!=0)
    wfile = fopen(outf,"w");
  else
    wfile=stdout;
  fsa_print(wfile,midfadeterminize,fsaname);
  if (stringlen(inf)!=0)
    fclose(wfile);
  if (kbm_print_level>0)
    printf("#\"Determinized\" fsa with %d states computed.\n",
	midfadeterminize->states->size);

  fsa_clear(midfadeterminize);
  tfree(midfadeterminize);
  exit(0);
}
예제 #17
0
int 
main (int argc, char *argv[])
{ int arg;
  fsa fsain, *fsadeterminize;
  char inf[100], outf[100], fsaname[100], tempfilename[100];
  storage_type ip_store = SPARSE; int dr = 0; /* cannot be changed */
  storage_type op_store = DENSE;
  boolean subsets=FALSE;

  setbuf(stdout,(char*)0);
  setbuf(stderr,(char*)0);

  inf[0] = '\0';
  outf[0] = '\0';
  arg = 1;
  while (argc > arg) {
    if (strcmp(argv[arg],"-s")==0)
      subsets = TRUE;
    else if (strcmp(argv[arg],"-op")==0) {
      arg++;
      if (arg >= argc)
        badusage_nfadet();
      if (strcmp(argv[arg],"d")==0)
        op_store = DENSE;
      else if (strcmp(argv[arg],"s")==0)
        op_store = SPARSE;
      else
        badusage_nfadet();
    }
    else if (strcmp(argv[arg],"-silent")==0)
      kbm_print_level = 0;
    else if (strcmp(argv[arg],"-v")==0)
      kbm_print_level = 2;
    else if (strcmp(argv[arg],"-vv")==0)
      kbm_print_level = 3;
    else if (strcmp(argv[arg],"-l")==0)
      kbm_large = TRUE;
    else if (strcmp(argv[arg],"-h")==0)
      kbm_huge = TRUE;
    else {
       if (argv[arg][0] == '-')
         badusage_nfadet();
       if (strcmp(inf,""))
         badusage_nfadet();
       strcpy(inf,argv[arg]);
    }
    arg++;
  }
  if (stringlen(inf)!=0) {
    strcpy(outf,inf);
    strcat(outf,".determinize");

    if ((rfile = fopen(inf,"r")) == 0) {
      fprintf(stderr,"Cannot open file %s.\n",inf);
      exit(1);
    }
  }
  else
    rfile = stdin;
  fsa_read(rfile,&fsain,ip_store,dr,0,TRUE,fsaname);
  if (stringlen(inf)!=0)
    fclose(rfile);

  if (fsain.flags[DFA]) {
    if (kbm_print_level > 0)
      printf("#Note: Input fsa is already deterministic!\n");
    tmalloc(fsadeterminize,fsa,1);
    fsa_init(fsadeterminize);
    fsa_copy(fsadeterminize,&fsain);
  } else {
    strcpy(tempfilename,inf);
    strcat(tempfilename,"temp_mid_XXX");
    fsadeterminize =
        nfa_determinize(&fsain,op_store,TRUE,TRUE,subsets,tempfilename);
  }

  fsa_clear(&fsain);

  if (subsets) {
    if (kbm_print_level>1)
      printf("  #Number of states of fsadeterminize = %d.\n",
          fsadeterminize->states->size);
  }
  else {
    if (kbm_print_level>1)
     printf("  #Number of states of fsadeterminize before minimisation = %d.\n",
          fsadeterminize->states->size);
    fsa_minimize(fsadeterminize);
    if (kbm_print_level>1)
      printf("  #Number of states of fsadeterminize after minimisation = %d.\n",
        fsadeterminize->states->size)  ;
  }

  strcat(fsaname,"_determinize");
  if (stringlen(inf)!=0)
    wfile = fopen(outf,"w");
  else
    wfile=stdout;
  fsa_print(wfile,fsadeterminize,fsaname);
  if (wfile!=stdout && kbm_print_level>0)
    printf("#\"Determinized\" fsa with %d states computed.\n",
	fsadeterminize->states->size);
  if (stringlen(inf)!=0)
    fclose(wfile);

  fsa_clear(fsadeterminize);
  tfree(fsadeterminize);
  exit(0);
}
예제 #18
0
int 
main (int argc, char *argv[])
{ int arg, i, g1, g2;
  fsa migenmult, *migm2ptr;
  char gpname[100], inf[100], outf[100], fsaname[100], tablefilename[100],
       prefix[16];
  storage_type ip_store = DENSE;
  int dr = 0;
  storage_type op_store = SPARSE;
  boolean readback = TRUE;
  boolean seengpname, seencosname;

  setbuf(stdout,(char*)0);
  setbuf(stderr,(char*)0);

  strcpy(prefix,"_x");
  arg = 1;
  seengpname=seencosname=FALSE;
  while (argc > arg) {
    if (strcmp(argv[arg],"-ip")==0) {
      arg++;
      if (arg >= argc)
        badusage_gpmigenmult2();
      if (strcmp(argv[arg],"d")==0)
        ip_store = DENSE;
      else if (argv[arg][0] == 's') {
        ip_store = SPARSE;
        if (stringlen(argv[arg]) > 1)
          dr = atoi(argv[arg]+1);
      }
      else
        badusage_gpmigenmult2();
    }
    else if (strcmp(argv[arg],"-op")==0) {
      arg++;
      if (arg >= argc)
        badusage_gpmigenmult2();
      if (strcmp(argv[arg],"d")==0)
        op_store = DENSE;
      else if (strcmp(argv[arg],"s")==0)
        op_store = SPARSE;
      else
        badusage_gpmigenmult2();
    }
    else if (strcmp(argv[arg],"-silent")==0)
      kbm_print_level = 0;
    else if (strcmp(argv[arg],"-v")==0)
      kbm_print_level = 2;
    else if (strcmp(argv[arg],"-vv")==0)
      kbm_print_level = 3;
    else if (strcmp(argv[arg],"-l")==0)
      kbm_large = TRUE;
    else if (strcmp(argv[arg],"-h")==0)
      kbm_huge = TRUE;
    else if (strcmp(argv[arg],"-pref")==0) {
      arg++;
      if (arg >= argc)
        badusage_gpmigenmult2();
      strcpy(prefix,argv[arg]);
    }
    else if (strcmp(argv[arg],"-f")==0){
      readback = FALSE;
      fprintf(stderr,"Sorry - readback option not yet available.\n");
      exit(1);
    }
    else if (argv[arg][0] == '-')
      badusage_gpmigenmult2();
    else if (!seengpname) {
      seengpname=TRUE;
      strcpy(gpname,argv[arg]);
    }
    else if (!seencosname) {
      seencosname=TRUE;
      sprintf(inf,"%s.%s",gpname,argv[arg]);
    }
    else
      badusage_gpmigenmult2();
    arg++;
  }
  if (!seengpname)
    badusage_gpmigenmult2();
  if (!seencosname)
    sprintf(inf,"%s.cos",gpname);
  
  strcpy(tablefilename,inf);
  strcat(tablefilename,".migm2_ut");

  strcpy(outf,inf);
  strcat(outf,".migm2");

  strcat(inf,".migm");

  if ((rfile = fopen(inf,"r")) == 0) {
    fprintf(stderr,"Cannot open file %s.\n",inf);
      exit(1);
  }
  fsa_read(rfile,&migenmult,ip_store,dr,0,TRUE,fsaname);
  fclose(rfile);

  migm2ptr =
     fsa_migm2(&migenmult,op_store,TRUE,tablefilename,readback,prefix);
  if (migm2ptr==0) exit(1);

  if (kbm_print_level>1)
    printf("  #Number of states of migenmult2 = %d.\n",migm2ptr->states->size);

  if (readback){
    if (midfa_labeled_minimize(migm2ptr)==-1) exit(1);
  }
  if (kbm_print_level>1)
    printf("  #Number of states of migenmult2 after minimization = %d.\n",
             migm2ptr->states->size);
  base_prefix(fsaname);
  strcat(fsaname,".gm2");
  wfile = fopen(outf,"w");
  fsa_print(wfile,migm2ptr,fsaname);
  fclose(wfile);

  if (kbm_print_level>0)
    printf("#Generalised length-2 multiplier with %d states computed.\n",
            migm2ptr->states->size);

  fsa_clear(migm2ptr);
  tfree(migm2ptr);
  exit(0);
}
예제 #19
0
int 
main (int argc, char *argv[])
{ int arg, min, max, i, rv;
  fsa testfsa;
  char inf[100], outf[100], fsaname[100], primestr[100], var[100] = "X";
  unsigned primes[100] = { 32749, 32719, 32717, 0}, nprimes = 3;
  storage_type ip_store = DENSE;
  boolean consistent;

  setbuf(stdout,(char*)0);
  setbuf(stderr,(char*)0);

  inf[0] = '\0';
  arg = 1;
  while (argc > arg) {
    if (strcmp(argv[arg],"-ip")==0) {
      arg++;
      if (arg >= argc)
        badusage_fsagrowth();
      if (strcmp(argv[arg],"d")==0)
        ip_store = DENSE;
      else if (argv[arg][0] == 's')
        ip_store = SPARSE;
      else
        badusage_fsagrowth();
    }
    else if (strcmp(argv[arg],"-var")==0) {
      arg++;
      if (arg >= argc)
        badusage_fsagrowth();
      strcpy(var, argv[arg]);
    }
    else if (strcmp(argv[arg],"-v")==0)
      kbm_print_level = 2;
    else if (strcmp(argv[arg],"-primes")==0) {
      char *pptr, *p;
      arg++;
      if (arg >= argc)
        badusage_fsagrowth();
      nprimes = 0;
      strcpy(primestr,argv[arg]); strcat(primestr,",");
      for (pptr = p = primestr; *p; p++)
      if (*p < '0' || *p > '9') {
        *p = 0;
	if (p-pptr >= 1) primes[nprimes++] = atoi(pptr);
	pptr = p+1;
      }
      if (nprimes == 0) badusage_fsagrowth();
    } else {
       if (argv[arg][0] == '-')
         badusage_fsagrowth();
       strcpy(inf,argv[arg]);
    }
    arg++;
  }
  if (stringlen(inf)!=0) {
    strcpy(outf,inf);
    strcat(outf,".growth");

    if ((rfile = fopen(inf,"r")) == 0) {
      fprintf(stderr,"Cannot open file %s.\n",inf);
      exit(1);
    }
  }
  else
    rfile = stdin;
  fsa_read(rfile,&testfsa,ip_store,0,0,TRUE,fsaname);
  if (stringlen(inf)!=0) {
    fclose(rfile);
    wfile = fopen(outf,"w");
  }
  else wfile=stdout;

  fprintf(wfile,"local X; X:=Indeterminate(Rationals,1); return\n\n");
  kbm_buffer[0]='\0';

  primes[nprimes] = 0;
  rv=fsa_growth(wfile,&testfsa,primes,var);
  if (rv== -1) exit(1);
  consistent= (boolean)rv;

  if (stringlen(inf)!=0)
    fclose(wfile);

  fsa_clear(&testfsa);
  if (!consistent) {
    fprintf(stderr,
  "WARNING: The polynomials modulo the primes chosen were not consistent.\n");
    fprintf(stderr,
  "         so the integral coefficients output are unlikely to be correct.\n");
    exit(2);
  }
  exit(0);
}
예제 #20
0
int 
main (int argc, char *argv[])
{ int arg, min, max, i, n, rv;
  fsa testfsa;
  char inf[100], outf[100], fsaname[100];
  storage_type ip_store = DENSE;
  int stateno=0;
  boolean labels=FALSE;
  boolean bfs, minset, maxset, putcomma;
  

  setbuf(stdout,(char*)0);
  setbuf(stderr,(char*)0);

  minset = maxset = FALSE;
  bfs = FALSE;
  inf[0] = '\0';
  arg = 1;
  n = 0;
  while (argc > arg) {
    if (strcmp(argv[arg], "-is") == 0) {
      arg++;
      if (arg >= argc)
         badusage_fsaenumerate();
      n = atoi(argv[arg]);
    }
    else if (strcmp(argv[arg],"-ip")==0) {
      arg++;
      if (arg >= argc)
        badusage_fsaenumerate();
      if (strcmp(argv[arg],"d")==0)
        ip_store = DENSE;
      else if (argv[arg][0] == 's')
        ip_store = SPARSE;
      else
        badusage_fsaenumerate();
    }
    else if (strcmp(argv[arg],"-dfs")==0)
      bfs = FALSE;
    else if (strcmp(argv[arg],"-bfs")==0)
      bfs = TRUE;
    else if (strcmp(argv[arg],"-l")==0) 
      labels = TRUE;
    else if (strcmp(argv[arg],"-s")==0)
      stateno = 1; 
    else {
       if (argv[arg][0] == '-')
         badusage_fsaenumerate();
       if (strcmp(inf,""))
         badusage_fsaenumerate();
       if (!minset) {
         if (!is_int(argv[arg])) badusage_fsaenumerate();
         min = atoi(argv[arg]);
         minset = TRUE;
       }
       else if (!maxset) {
         if (!is_int(argv[arg])) badusage_fsaenumerate();
         max = atoi(argv[arg]);
         maxset = TRUE;
       }
       else strcpy(inf,argv[arg]);
    }
    arg++;
  }
  if (stringlen(inf)==0)
    rfile=stdin;
  else {
    strcpy(outf,inf);
    strcat(outf,".enumerate");
    if ((rfile = fopen(inf,"r")) == 0) {
      fprintf(stderr,"Cannot open file %s.\n",inf);
      exit(1);
    }
  }
  fsa_read(rfile,&testfsa,ip_store,0,0,TRUE,fsaname);
  if (stringlen(inf))
    fclose(rfile);
  strcat(fsaname,".words");

  if (labels && stateno) {
    fprintf(stderr,"Error: cannot use -s and -l together.\n");
    exit(1);
  }
  if (labels) stateno=2;
  if (n>testfsa.states->size) {
    fprintf(stderr,"Error: specified initial state is too large.\n");
    exit(1);
  }
  if (n>0 && testfsa.num_initial>0) {
    testfsa.initial[1]=n;
    /* This may destroy various properties of the automata */
    testfsa.flags[MINIMIZED]=FALSE;
    testfsa.flags[BFS]=FALSE;
    testfsa.flags[ACCESSIBLE]=FALSE;
    testfsa.flags[TRIM]=FALSE;
  }

  if (stringlen(inf))
    wfile = fopen(outf,"w");
  else
    wfile=stdout;
  fprintf(wfile,"%s := [\n",fsaname);

  putcomma = FALSE;
  if (bfs) {
    for (i=min;i<=max;i++) {
      rv = fsa_enumerate(wfile,&testfsa,i,i,putcomma,stateno);
      if (rv== -1) exit(1);
      putcomma = (boolean)rv || putcomma;
    }
  }
  else {
    rv = fsa_enumerate(wfile,&testfsa,min,max,putcomma,stateno);
    if (rv== -1) exit(1);
  }

  fprintf(wfile,"\n];\n");
  if (stringlen(inf))
    fclose(wfile);

  fsa_clear(&testfsa);
  exit(0);
}
예제 #21
0
int 
main (int argc, char *argv[])
{ int arg, i, g1, g2;
  fsa mult1, mult2, *micompmult;
  char inf1[100], inf2[100], outf[100], fsaname[100],
       tempfilename[100], *inf2ptr;
  storage_type ip_store = DENSE;
  int dr = 0;
  storage_type op_store = SPARSE;
  boolean readback = TRUE;

  setbuf(stdout,(char*)0);
  setbuf(stderr,(char*)0);

  inf1[0] = '\0';
  inf2[0] = '\0';
  outf[0] = '\0';
  arg = 1;
  while (argc > arg) {
    if (strcmp(argv[arg],"-ip")==0) {
      arg++;
      if (arg >= argc)
        badusage_gpmicomp();
      if (strcmp(argv[arg],"d")==0)
        ip_store = DENSE;
      else if (argv[arg][0] == 's') {
        ip_store = SPARSE;
        if (stringlen(argv[arg]) > 1)
          dr = atoi(argv[arg]+1);
      }
      else
        badusage_gpmicomp();
    }
    else if (strcmp(argv[arg],"-op")==0) {
      arg++;
      if (arg >= argc)
        badusage_gpmicomp();
      if (strcmp(argv[arg],"d")==0)
        op_store = DENSE;
      else if (strcmp(argv[arg],"s")==0)
        op_store = SPARSE;
      else
        badusage_gpmicomp();
    }
    else if (strcmp(argv[arg],"-silent")==0)
      kbm_print_level = 0;
    else if (strcmp(argv[arg],"-v")==0)
      kbm_print_level = 2;
    else if (strcmp(argv[arg],"-vv")==0)
      kbm_print_level = 3;
    else if (strcmp(argv[arg],"-l")==0)
      kbm_large = TRUE;
    else if (strcmp(argv[arg],"-h")==0)
      kbm_huge = TRUE;
    else if (strcmp(argv[arg],"-f")==0) {
      readback = FALSE;
      fprintf(stderr,"Sorry - readback option not yet available.\n");
      exit(1);
    }
    else {
       if (argv[arg][0] == '-')
         badusage_gpmicomp();
       if (strcmp(outf,"")!=0)
         badusage_gpmicomp();
       else if (strcmp(inf1,"")==0)
         strcpy(inf1,argv[arg]);
       else if (strcmp(inf2,"")==0)
         strcpy(inf2,argv[arg]);
       else
         strcpy(outf,argv[arg]);
    }
    arg++;
  }
  if (stringlen(inf1)==0 || stringlen(inf2)==0 || stringlen(outf)==0)
    badusage_gpmicomp();
  
  strcpy(tempfilename,inf1);
  /* The next lines avoid a potential problem when "inf2" contains a '/' */
  inf2ptr=inf2+strlen(inf2);
  while (--inf2ptr>=inf2) if (*inf2ptr=='/')
    break;
  inf2ptr++;
  strcat(tempfilename,inf2ptr);
  strcat(tempfilename,"_tempXXX");

  if ((rfile = fopen(inf1,"r")) == 0) {
    fprintf(stderr,"Cannot open file %s.\n",inf1);
      exit(1);
  }
  fsa_read(rfile,&mult1,ip_store,dr,0,TRUE,fsaname);

  if ((rfile = fopen(inf2,"r")) == 0) {
    fprintf(stderr,"Cannot open file %s.\n",inf2);
      exit(1);
  }
  fsa_read(rfile,&mult2,ip_store,dr,0,TRUE,fsaname);
  fclose(rfile);

  micompmult =
       fsa_micomposite(&mult1,&mult2,op_store,TRUE,tempfilename,readback);
  if (micompmult==0) exit(1);

  if (kbm_print_level>1)
    printf("  #Number of states of composite before minimization = %d.\n",
       micompmult->states->size);

  if (readback) {
    if (mimult_minimize(micompmult)==-1) exit(1);
  }
/* 
  else
    fsa_ip_minimize(micompmult);
*/

  if (kbm_print_level>1)
    printf("  #Number of states of composite after minimization = %d.\n",
       micompmult->states->size);

  base_prefix(fsaname);
  strcat(fsaname,".micomp");
  wfile = fopen(outf,"w");
  fsa_print(wfile,micompmult,fsaname);
  fclose(wfile);

  if (kbm_print_level>0)
    printf("#Composite multiplier with %d states computed.\n",
            micompmult->states->size);

  fsa_clear(micompmult);
  tfree(micompmult);
  exit(0);
}
예제 #22
0
파일: ppgap.c 프로젝트: gap-packages/kbmag
int 
main (int argc, char *argv[])
{ int  i, l, ct;
  boolean first;
  rewriting_system  rws, *rwsptr;
  static char gpname[100],  outf[100];

  setbuf(stdout,(char*)0);
  setbuf(stderr,(char*)0);

  rwsptr= &rws;
  rwsptr->maxeqns = MAXEQNS;
  rwsptr->maxreducelen = MAXREDUCELEN;
  rwsptr->cosets=FALSE;
  rwsptr->inv_of=0;
  rwsptr->weight=0;rwsptr->level=0;rwsptr->history=0;
  rwsptr->slowhistory=0;rwsptr->slowhistorysp=0;
  rwsptr->preflen=0;rwsptr->prefno=0;

  if (argc!=2) badusage_ppgap();
  strcpy(gpname,argv[1]);
  strcpy(outf,gpname); strcat(outf,".gap");
  
/* First read in the defining relations for the group. */
  if ((rfile = fopen(gpname,"r")) == 0) {
    fprintf(stderr,"Cannot open file %s.\n",gpname);
      exit(1);
  }
  read_kbinput_simple(rfile,TRUE,rwsptr);
  fclose(rfile);

  wfile = fopen(outf,"w");

  kbm_buffer[0]='\0';
  add_to_buffer(0,"_RWS.gpMon := FreeGroup(");
  first = TRUE;

  if (rws.num_gens==0) add_to_buffer(0,"0");
  else for (i=1;i<=rws.num_gens;i++){
     l = stringlen(rws.gen_name[i]);
     if (l<=3 || strcmp(rws.gen_name[i]+l-3,"^-1")) {
       if (!first)
          add_to_buffer(0,",");
       first = FALSE;
       sprintf(kbm_buffer+stringlen(kbm_buffer),"\"%s\"",rws.gen_name[i]);
     }
  }
  add_to_buffer(0,");");
  printbuffer(wfile);

  ct = 0;
  for (i=1;i<=rws.num_gens;i++) {
    l = stringlen(rws.gen_name[i]);
    if (l<=3 || strcmp(rws.gen_name[i]+l-3,"^-1")) {
       ct++;
       fprintf(wfile,"%s := _RWS.gpMon.%d;\n",rws.gen_name[i],ct);
    }
  }
  fprintf(wfile,"_ := IdWord;\n");
  fclose(wfile);
  rws_clear(rwsptr);
  exit(0);
}
예제 #23
0
int 
main (int argc, char *argv[])
{ int arg, i, ct, *inv, old_ndiff, maxneweqns, numeqns, ngens, maxwdiffs;
  fsa  diff2, genmult;
  char gpname[100], cosgpname[100], inf1[100], inf2[100], inf3[100],
       outf[100], outfwg[100], outfec[100], fsaname[100];
  fsa *wd_fsa; /* This is for doing word-reductions in the case that we
              * correct the diff2 machine
              */
  fsa wa;     /* The word-acceptor in the wtlex case */
  int weight[MAXGEN+1]; /* The weights of the generators in the wtlex case */
  gen testword[MAXREDUCELEN]; /* for word reduction */
  char **names; /* generator names in case we need to output words */
  reduction_equation *eqnptr;
  reduction_struct rs_wd;
  storage_type ip_store = DENSE;
  int dr = 0;
  boolean seengpname, seencosname;
  boolean cosets=FALSE;
  boolean wtlex=FALSE;
  rewriting_system  rws;
  boolean outputwords = FALSE;
  int separator=0;

  setbuf(stdout,(char*)0);
  setbuf(stderr,(char*)0);

  rws.maxeqns = MAXRWSEQNS;
  maxneweqns = MAXNEWEQNS;
  maxwdiffs = MAXWDIFFS;
  inf1[0] = '\0';
  inf2[0] = '\0';
  outf[0] = '\0';
  arg = 1;
  seengpname=seencosname=FALSE;
  while (argc > arg) {
    if (strcmp(argv[arg],"-ip")==0) {
      arg++;
      if (arg >= argc)
        badusage_gpcheckmult();
      if (strcmp(argv[arg],"d")==0)
        ip_store = DENSE;
      else if (argv[arg][0] == 's') {
        ip_store = SPARSE;
        if (stringlen(argv[arg]) > 1)
          dr = atoi(argv[arg]+1);
      }
      else
        badusage_gpcheckmult();
    }
    else if (strcmp(argv[arg],"-silent")==0)
      kbm_print_level = 0;
    else if (strcmp(argv[arg],"-v")==0)
      kbm_print_level = 2;
    else if (strcmp(argv[arg],"-vv")==0)
      kbm_print_level = 3;
    else if (strcmp(argv[arg],"-l")==0)
      kbm_large = TRUE;
    else if (strcmp(argv[arg],"-h")==0)
      kbm_huge = TRUE;
    else if (strcmp(argv[arg],"-ow")==0)
      outputwords = TRUE;
    else if (strncmp(argv[arg],"-cos",4)==0)
      cosets = TRUE;
    else if (strcmp(argv[arg],"-m")==0) {
      arg++;
      if (arg >= argc)
        badusage_gpcheckmult();
      maxneweqns = atoi(argv[arg]);
    }
    else if (strcmp(argv[arg],"-mwd")==0) {
      arg++;
      if (arg >= argc)
        badusage_gpcheckmult();
      maxwdiffs = atoi(argv[arg]);
    }
    else if (strcmp(argv[arg],"-wtlex")==0)
      wtlex = TRUE;
    else if (argv[arg][0] == '-')
      badusage_gpcheckmult();
    else if (!seengpname) {
      seengpname=TRUE;
      strcpy(gpname,argv[arg]);
    }
    else if (!seencosname) {
      seencosname=TRUE;
      sprintf(cosgpname,"%s.%s",gpname,argv[arg]);
    }
    else
      badusage_gpcheckmult();
    arg++;
  }
  if (!seengpname)
    badusage_gpcheckmult();
  if (cosets && wtlex) {
    fprintf(stderr,
        "Sorry: -cos and -wtlex options cannot be used together.\n");
    badusage_gpcheckmult();
  }
  if (cosets && !seencosname)
    sprintf(cosgpname,"%s.cos",gpname);

  if (cosets) strcpy(inf1,cosgpname);
  else strcpy(inf1,gpname);

  strcpy(inf2,inf1);
  strcat(inf1,".gm");

  if (cosets) sprintf(outfec,"%s.cm.ec",cosgpname);
  else sprintf(outfec,"%s.cm.ec",gpname);

  if ((rfile = fopen(inf1,"r")) == 0) {
    fprintf(stderr,"Cannot open file %s.\n",inf1);
      exit(1);
  }
  fsa_read(rfile,&genmult,ip_store,dr,0,TRUE,fsaname);
  fclose(rfile);

  tmalloc(eqnptr,reduction_equation,maxneweqns)
  if (cosets)
     separator=rs_wd.separator=genmult.alphabet->base->size+1;
  if ((numeqns =
         fsa_checkmult(&genmult,eqnptr,maxneweqns,cosets,separator)) > 0) {
 /* A multiplier was not valid, so groupname.(mi)diff2 will need updating. */

    if (outputwords) {
    /* We do not update gpname.diff2, but output the offending words. */
      if (cosets) strcpy(outfwg,cosgpname);
      else strcpy(outfwg,gpname);
      strcat(outfwg,".wg");
      wfile=fopen(outfwg,"w");
      base_prefix(fsaname);
      fprintf(wfile,"%s.wg := [\n",fsaname);
      names=genmult.alphabet->base->names;
      for (i=0;i<numeqns;i++) {
        strcpy(kbm_buffer,"  [");
        if (cosets)
          add_word_to_buffer(wfile,eqnptr[i].lhs+1,names);
        else
          add_word_to_buffer(wfile,eqnptr[i].lhs,names);
        strcat(kbm_buffer,",");
        add_word_to_buffer(wfile,eqnptr[i].rhs,names);
        if (i<numeqns-1) strcat(kbm_buffer,"],");
        else strcat(kbm_buffer,"]");
        fprintf(wfile,"%s\n",kbm_buffer);
      }
      fprintf(wfile,"];\n");
      fclose(wfile);
      fsa_clear(&genmult);
      for (i=0;i<numeqns;i++) {
        tfree(eqnptr[i].lhs);
        tfree(eqnptr[i].rhs);
      }
      tfree(eqnptr);
      wfile=fopen(outfec,"w");
      fprintf(wfile,"_ExitCode := 2;\n");
      fclose(wfile);
      exit(2);
    }
    fsa_clear(&genmult);
    if (cosets) strcat(inf2,".midiff2");
    else strcat(inf2,".diff2");
    strcpy(outf,inf2);
    if (kbm_print_level>1)
      printf("  #Altering wd-machine to make it accept new equations.\n");
    if ((rfile = fopen(inf2,"r")) == 0) {
        fprintf(stderr,"Cannot open file %s.\n",inf2);
          exit(1);
    }
    /* We read groupname.(mi)diff2 into diff2,  and then copy it into
     * wd_fsa. The copy is used for reducing words - Not surprisingly,
     * we get problems if we try to alter it while using it at
     * the same time!
     */

    fsa_read(rfile,&diff2,DENSE,0,maxwdiffs,TRUE,fsaname);
    fclose(rfile);
    tmalloc(wd_fsa,fsa,1);
    fsa_copy(wd_fsa,&diff2);
    if (wtlex) { /* we have to read in the weights from the group file */
      if ((rfile = fopen(gpname,"r")) == 0) {
        fprintf(stderr,"Cannot open file %s.\n",gpname);
          exit(1);
      }
      read_kbinput_simple(rfile,TRUE,&rws);
      fclose(rfile);
      /* we only need the weights, which we can simply copy */
      for (i=1;i<=rws.num_gens;i++)
        weight[i] = rws.weight[i];
      weight[rws.num_gens+1]=0; /* padding symbol */
      rws_clear(&rws);
      strcpy(inf3,gpname);
      strcat(inf3,".wa");
      if ((rfile = fopen(inf3,"r")) == 0) {
        fprintf(stderr,"Cannot open file %s.\n",inf3);
          exit(1);
      }
      fsa_read(rfile,&wa,DENSE,0,0,TRUE,fsaname);
      fclose(rfile);
    }
    rs_wd.wd_fsa = wd_fsa;
    reduce_word =
           cosets ? diff_reduce_cos : wtlex ? diff_reduce_wl : diff_reduce;
    if (fsa_table_dptr_init(wd_fsa)==-1) return -1;
    if (fsa_table_dptr_init(&diff2)== -1) return -1;
    if (cosets){
      tmalloc(diff2.is_initial,boolean,maxwdiffs+1);
      for (i=1;i<=maxwdiffs;i++) diff2.is_initial[i]=FALSE;
      for (i=1;i<=diff2.num_initial;i++)
        diff2.is_initial[diff2.initial[i]]=TRUE;
    }
    else if (wtlex){
      rs_wd.wa = &wa;
      rs_wd.weight = weight;
      rs_wd.maxreducelen = MAXREDUCELEN;
    }
/* We need to know the inverses of generators - let's just work them out!  */
    ngens = diff2.alphabet->base->size;
    if (calculate_inverses(&inv,ngens,&rs_wd)==-1) return -1;
    old_ndiff = diff2.states->size;

/* Now add the new equations
 * The right hand side of the equation to be added will be the reduction of
 * the lhs times the generator which is currently in the rhs.
 */
    for (i=0;i<numeqns;i++) {
      genstrcat(eqnptr[i].lhs,eqnptr[i].rhs);
      tfree(eqnptr[i].rhs);
      genstrcpy(testword,eqnptr[i].lhs);
      reduce_word(testword,&rs_wd);
      tmalloc(eqnptr[i].rhs,gen,genstrlen(testword)+1);
      genstrcpy(eqnptr[i].rhs,testword);
      if (cosets) {
        if (add_wd_fsa_cos(&diff2,eqnptr+i,inv,TRUE,&rs_wd)== -1) exit(1);
      }
      else
        if (add_wd_fsa(&diff2,eqnptr+i,inv,TRUE,&rs_wd)== -1) exit(1);
    }
    
    if (cosets) {
      tfree(diff2.initial);
      tmalloc(diff2.initial,int,diff2.num_initial+1);
      ct=0;
      for (i=1;i<=diff2.states->size;i++) if (diff2.is_initial[i])
        diff2.initial[++ct]=i;
      tfree(diff2.is_initial);
      make_full_wd_fsa_cos(&diff2,inv,old_ndiff+1,&rs_wd);
    }
    else
      make_full_wd_fsa(&diff2,inv,old_ndiff+1,&rs_wd);
    if (kbm_print_level>1)
      printf("  #Word-difference machine now has %d states.\n",
               diff2.states->size);

    wfile = fopen(inf2,"w");
    fsa_print(wfile,&diff2,fsaname);
    fclose(wfile);

    tfree(inv);
    fsa_clear(wd_fsa); fsa_clear(&diff2);
    tfree(wd_fsa);
    if (wtlex)
      fsa_clear(&wa);
    for (i=0;i<numeqns;i++) {
      tfree(eqnptr[i].lhs);
      tfree(eqnptr[i].rhs);
    }
    tfree(eqnptr);
    wfile=fopen(outfec,"w");
    fprintf(wfile,"_ExitCode := 2;\n");
    fclose(wfile);
    exit(2);
  }
예제 #24
0
int 
main (int argc, char *argv[])
{ int arg, i;
  fsa  fsaip,  *difflabsptr;
  char inf1[100], inf2[100], outf[100], fsaname[100], tempfilename[100];
  reduction_struct rs_wd;
  storage_type op_store = SPARSE;
  boolean diff1_ip, diff1c_ip, diff2_ip;
  boolean readback = TRUE;

  setbuf(stdout,(char*)0);
  setbuf(stderr,(char*)0);

  inf1[0] = '\0';
  inf2[0] = '\0';
  arg = 1;
  diff1_ip = diff1c_ip = diff2_ip = FALSE;
  while (argc > arg) {
    if (strcmp(argv[arg],"-op")==0) {
      arg++;
      if (arg >= argc)
        badusage_gpdifflabs();
      if (strcmp(argv[arg],"d")==0)
        op_store = DENSE;
      else if (strcmp(argv[arg],"s")==0)
        op_store = SPARSE;
      else
        badusage_gpdifflabs();
    }
    else if (strcmp(argv[arg],"-silent")==0)
      kbm_print_level = 0;
    else if (strcmp(argv[arg],"-v")==0)
      kbm_print_level = 2;
    else if (strcmp(argv[arg],"-vv")==0)
      kbm_print_level = 3;
    else if (strcmp(argv[arg],"-l")==0)
      kbm_large = TRUE;
    else if (strcmp(argv[arg],"-h")==0)
      kbm_huge = TRUE;
    else if (strcmp(argv[arg],"-diff1")==0)
      diff1_ip = TRUE;
    else if (strcmp(argv[arg],"-diff2")==0)
      diff2_ip = TRUE;
    else if (strcmp(argv[arg],"-diff1c")==0)
      diff1c_ip = TRUE;
    else {
       if (argv[arg][0] == '-')
         badusage_gpdifflabs();
       if (strcmp(inf2,"")==0) {
         strcpy(inf2,argv[arg]);
       }
       else {
         strcpy(inf1,inf2); strcat(inf1,"."); strcat(inf1,argv[arg]);
       }
    }
    arg++;
  }
  
  if (stringlen(inf1)==0)
    badusage_gpdifflabs();
  
  strcpy(tempfilename,inf1);
  strcat(tempfilename,"temp_d_XXX");

  if (diff1_ip)
    strcat(inf2,".diff1");
  else if (diff1c_ip)
    strcat(inf2,".diff1c");
  else
    strcat(inf2,".diff2");

  strcpy(outf,inf1);
  strcat(outf,".difflabs");

/* First read word-difference machine for word-reduction */
  if ((rfile = fopen(inf2,"r")) == 0) {
    fprintf(stderr,"Cannot open file %s.\n",inf2);
      exit(1);
  }
  tmalloc(rs_wd.wd_fsa,fsa,1);
  fsa_read(rfile,rs_wd.wd_fsa,DENSE,0,0,TRUE,fsaname);
  fclose(rfile);
  if (fsa_table_dptr_init(rs_wd.wd_fsa)==-1) exit(1);

/* Now read main input fsa */
  if ((rfile = fopen(inf1,"r")) == 0) {
    fprintf(stderr,"Cannot open file %s.\n",inf1);
      exit(1);
  }
  fsa_read(rfile,&fsaip,DENSE,0,0,TRUE,fsaname);
  fclose(rfile);

  difflabsptr =
    fsa_difflabs(&fsaip,&rs_wd,op_store,TRUE,tempfilename,readback);

  if (difflabsptr==0) exit(1);

  if (kbm_print_level>1)
    printf("  #Number of states of labeled machine before minimisation = %d.\n",
        difflabsptr->states->size);
  if (readback) {
    if (fsa_labeled_minimize(difflabsptr)== -1) exit(1);
  }
  else
    if (fsa_ip_labeled_minimize(difflabsptr)== -1) exit(1);
  if (kbm_print_level>1)
    printf("  #Number of states of labeled machine after minimisation = %d.\n",
        difflabsptr->states->size);

  base_prefix(fsaname);
  strcat(fsaname,".difflabs");
  wfile = fopen(outf,"w");
    fsa_print(wfile,difflabsptr,fsaname);
  fclose(wfile);

  if (kbm_print_level>0)
    printf("#Labeled word-difference machine with %d states computed.\n",
            difflabsptr->states->size);

  fsa_clear(difflabsptr);
  tfree(difflabsptr);
  tfree(rs_wd.wd_fsa);
  exit(0);
}