1 /* ppgap4.c   9.3.00.
2  * GAP4 version of ppgap
3  *
4  * 6/8/98 large scale reorganisation to omit globals, etc.
5  *
6  * Read a kb-input file and make a preprocessor file for GAP
7  *
8  * SYNOPSIS:
9  * ppgap4  groupname
10  *
11  */
12 
13 #include <stdio.h>
14 
15 #include "defs.h"
16 #include "fsa.h"
17 #include "rws.h"
18 #include "definitions.h"
19 
20 #define MAXEQNS 1024
21 #define MAXREDUCELEN 4096
22 
23 static FILE *rfile, *wfile;
24 
25 /* Functions defined in this file */
26 void badusage(void);
27 
main(int argc,char * argv[])28 int main(int argc, char *argv[])
29 {
30   int i, l, ct;
31   boolean first, isgroup;
32   rewriting_system rws, *rwsptr;
33   static char gpname[100], outf[100];
34 
35   setbuf(stdout, (char *)0);
36   setbuf(stderr, (char *)0);
37 
38   rwsptr = &rws;
39   rwsptr->maxeqns = MAXEQNS;
40   rwsptr->maxreducelen = MAXREDUCELEN;
41   rwsptr->cosets = FALSE;
42   rwsptr->inv_of = 0;
43   rwsptr->weight = 0;
44   rwsptr->level = 0;
45   rwsptr->history = 0;
46   rwsptr->slowhistory = 0;
47   rwsptr->slowhistorysp = 0;
48   rwsptr->preflen = 0;
49   rwsptr->prefno = 0;
50 
51   if (argc != 2)
52     badusage();
53   strcpy(gpname, argv[1]);
54   strcpy(outf, gpname);
55   strcat(outf, ".gap4");
56 
57   /* First read in the defining relations for the group. */
58   if ((rfile = fopen(gpname, "r")) == 0) {
59     fprintf(stderr, "Cannot open file %s.\n", gpname);
60     exit(1);
61   }
62   read_kbinput_simple(rfile, TRUE, rwsptr);
63   fclose(rfile);
64 
65   isgroup = TRUE;
66   for (i = 1; i <= rws.num_gens; i++) {
67     if ((rws.inv_of)[i] == 0) {
68       isgroup = FALSE;
69       break;
70     }
71   }
72   wfile = fopen(outf, "w");
73 
74   kbm_buffer[0] = '\0';
75   if (isgroup)
76     add_to_buffer(0, "_RWS.FreeGpMonSgp := FreeGroup(");
77   else
78     add_to_buffer(0, "_RWS.FreeGpMonSgp := FreeMonoid(");
79 
80   first = TRUE;
81 
82   if (rws.num_gens == 0)
83     add_to_buffer(0, "0");
84   else
85     for (i = 1; i <= rws.num_gens; i++) {
86       l = stringlen(rws.gen_name[i]);
87       if (l <= 3 || strcmp(rws.gen_name[i] + l - 3, "^-1")) {
88         if (!first)
89           add_to_buffer(0, ",");
90         first = FALSE;
91         sprintf(kbm_buffer + stringlen(kbm_buffer), "\"%s\"", rws.gen_name[i]);
92       }
93       else if (!isgroup) {
94         fprintf(stderr,
95                 "Error in ppgap4: inverses names only allowed in groups.\n");
96         exit(1);
97       }
98     }
99   add_to_buffer(0, ");");
100   printbuffer(wfile);
101 
102   ct = 0;
103   for (i = 1; i <= rws.num_gens; i++) {
104     l = stringlen(rws.gen_name[i]);
105     if (l <= 3 || strcmp(rws.gen_name[i] + l - 3, "^-1")) {
106       ct++;
107       fprintf(wfile, "%s := _RWS.FreeGpMonSgp.%d;\n", rws.gen_name[i], ct);
108     }
109   }
110   fprintf(wfile, "_ := One(_RWS.FreeGpMonSgp);\n");
111   fprintf(wfile, "IdWord := One(_RWS.FreeGpMonSgp);\n");
112   fclose(wfile);
113   rws_clear(rwsptr);
114   exit(0);
115 }
116 
badusage(void)117 void badusage(void)
118 {
119   fprintf(stderr, "Usage: ppgap4 groupname.\n");
120   exit(1);
121 }
122