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