GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
/****************************************************************************1@2@ ----------------------------------------------------------------------------3@4@ FILE: Q_catalog.c5@6@ ----------------------------------------------------------------------------7@8******************************************************************************/910#include "typedef.h"11#include "name.h"1213void (*(display_element [NR_OF_ELEMENTS_IN_EACH_ENTRY])) (entry *data);14void (*(load_element [NR_OF_ELEMENTS_IN_EACH_ENTRY])) (const char *string, entry *data);15void (*(delete_element [NR_OF_ELEMENTS_IN_EACH_ENTRY])) (entry *data);16int (*(compare_element [NR_OF_ELEMENTS_IN_EACH_ENTRY])) (entry *data1, entry *data2);17const char *name_element [NR_OF_ELEMENTS_IN_EACH_ENTRY];181920static int bitfield [32] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536};2122static void *xmalloc(int size, const char *string)23{24void *pointer;25if ( (pointer = malloc (size)) == NULL)26{27perror (string);28exit (2);29}3031return pointer;32}33343536static void display_abbreviation (entry *element)37{38fprintf (stdout, "%s ", element->abbreviation);39}4041static void display_degree (entry *element)42{43fprintf (stdout, "%i ", element->degree);44}4546static void display_symbol (entry *element)47{48fprintf (stdout, "%s ", element->symbol);49}505152static void display_order (entry *element)53{54fprintf (stdout, "%i ", element->order);55}5657static void display_discriminant (entry *element)58{59fprintf (stdout, "%s ", element->discriminant);60}6162static void display_zclasses (entry *element)63{64fprintf (stdout, "%i ", element->zclasses);65}6667static void display_affine (entry *element)68{69fprintf (stdout, "%i ", element->affine);70}7172static void display_torsionfree (entry *element)73{74if (element->torsionfree != -1)75fprintf (stdout, "%i ", element->torsionfree);76else77fprintf (stdout, "Unknown ");78}7980static void display_no_conclass (entry *element)81{82fprintf (stdout, "%i ", element->no_conclass);83}8485static void display_no_idem (entry *element)86{87fprintf (stdout, "%i ", element->no_idem);88}899091static void load_abbreviation (const char *string, entry *element)92{93/* if ( (element->abbreviation = (char *) malloc ( (strlen (string) + 1) * sizeof (char))) == NULL ||94sprintf (element->abbreviation, string) < 0)95{96perror ("load_abbreviation");97exit (EXIT_FAILURE);98}*/99100element->abbreviation = (char *) xmalloc ( (strlen(string)+1) * sizeof(char),101"load_abbreviation");102103if ( sprintf (element->abbreviation, string) < 0)104{105perror ("load_abbreviation");106exit (4);107}108109110}111112static void load_degree (const char *string, entry *element)113{114if (sscanf (string, "%i", &(element->degree)) != 1)115{116fprintf (stderr, "Data has wrong structure.\n");117exit (4);118}119}120121static void load_symbol (const char *string, entry *element)122{123124/* if ( (element->symbol = (char *) malloc ( (strlen (string) + 1) * sizeof (char))) == NULL ||125sprintf (element->symbol, string) < 0)126{127perror ("load_symbol");128exit (EXIT_FAILURE);129}*/130131element->symbol = (char *) xmalloc ( (strlen(string)+1) * sizeof(char),132"load_symbol");133134if( sprintf(element->symbol, string) < 0)135{136perror ("load_symbol");137exit (4);138}139}140141142static void load_order (const char *string, entry *element)143{144if (sscanf (string, "%i", &(element->order)) != 1)145{146fprintf (stderr, "Data has wrong structure.\n");147exit (4);148}149}150151static void load_discriminant (const char *string, entry *element)152{153154/* if ( (element->discriminant = (char *) malloc ( (strlen (string) + 1) * sizeof (char))) == NULL || */155/* sprintf (element->discriminant, string) < 0) */156/* { */157/* perror ("load_discriminant"); */158/* exit (EXIT_FAILURE); */159/* } */160161element->discriminant = (char *) xmalloc ( (strlen(string)+1) * sizeof(char),162"load_discriminant");163164if( sprintf (element->discriminant, string) < 0)165{166perror ("load_discriminant");167exit (4);168}169170}171172static void load_zclasses (const char *string, entry *element)173{174if (sscanf (string, "%i", &(element->zclasses)) != 1)175{176fprintf (stderr, "Data has wrong structure.\n");177exit (4);178}179}180181static void load_affine (const char *string, entry *element)182{183if (sscanf (string, "%i", &(element->affine)) != 1)184{185fprintf (stderr, "Data has wrong structure.\n");186exit (4);187}188}189190static void load_torsionfree (const char *string, entry *element)191{192if (sscanf (string, "%i", &(element->torsionfree)) != 1)193{194fprintf (stderr, "Data has wrong structure.\n");195exit (4);196}197}198199static void load_no_conclass (const char *string, entry *element)200{201if (sscanf (string, "%i", &(element->no_conclass) ) != 1)202{203fprintf (stderr, "Data has wrong structure.\n");204exit (4);205}206}207208static void load_no_idem (const char *string, entry *element)209{210if (sscanf (string, "%i", &(element->no_idem) ) != 1)211{212fprintf (stderr, "Data has wrong structure.\n");213exit (4);214}215}216217218219static void delete_abbreviation (entry *element)220{221free (element->abbreviation);222}223224static void delete_degree (entry *element)225{226return;227}228229static void delete_symbol (entry *element)230{231free (element->symbol);232}233234static void delete_order (entry *element)235{236return;237}238239static void delete_discriminant (entry *element)240{241free (element->discriminant);242}243244static void delete_zclasses (entry *element)245{246return;247}248249static void delete_affine (entry *element)250{251return;252}253254static void delete_torsionfree (entry *element)255{256return;257}258259static void delete_no_conclass (entry *element)260{261return;262}263264static void delete_no_idem (entry *element)265{266return;267}268269270static int cmp_abbreviation (entry *entry1, entry *entry2)271{272/* If the abb(..)-name contains no dot, then it should match with any273database entry matching to the first dot. */274if (strchr (entry2->abbreviation, '.') != NULL)275{276if (strcmp (entry1->abbreviation, entry2->abbreviation) == 0)277return 0;278}279else280if (strncmp (entry1->abbreviation, entry2->abbreviation, strlen (entry2->abbreviation)) == 0)281return 0;282283return bitfield [COND_ABBREVIATION];284}285286static int cmp_degree (entry *entry1, entry *entry2)287{288if (entry1->degree == entry2->degree)289return 0;290291return bitfield [COND_DEGREE];292}293294static int cmp_symbol (entry *entry1, entry *entry2)295{296if ( ! strcmp (entry1->symbol, entry2->symbol))297return 0;298299return bitfield [COND_SYMBOL];300}301302static int cmp_order (entry *entry1, entry *entry2)303{304if (entry1->order == entry2->order)305return 0;306307return bitfield [COND_ORDER];308}309310static int cmp_discriminant (entry *entry1, entry *entry2)311{312if ( ! strcmp (entry1->discriminant, entry2->discriminant))313return 0;314315return bitfield [COND_DISCRIMINANT];316}317318static int cmp_zclasses (entry *entry1, entry *entry2)319{320if (entry1->zclasses == entry2->zclasses)321return 0;322323return bitfield [COND_ZCLASSES];324}325326static int cmp_affine (entry *entry1, entry *entry2)327{328if (entry1->affine == entry2->affine)329return 0;330331return bitfield [COND_AFFINE];332}333334static int cmp_torsionfree (entry *entry1, entry *entry2)335{336if (entry1->torsionfree == entry2->torsionfree)337return 0;338339return bitfield [COND_TORSIONFREE];340}341342static int cmp_no_conclass (entry *entry1, entry *entry2)343{344if (entry1->no_conclass == entry2->no_conclass)345return 0;346347return bitfield [COND_NO_CONCLASS];348}349350static int cmp_no_idem (entry *entry1, entry *entry2)351{352if (entry1->no_idem == entry2->no_idem)353return 0;354355return bitfield [COND_NO_IDEM];356}357358359360static void read_database_entry (FILE *file, entry *data)361{362int i;363const char string[200];364365for (i=0; i<NR_OF_ELEMENTS_IN_EACH_ENTRY; i++)366{367if (fscanf (file, "%199s", string) != 1)368{369fprintf (stderr, "Data has wrong structure.\n");370exit (4);371}372(load_element [i]) (string, data);373}374}375376377void apply_cond_to_display_list (conditions *cond, database *database, int display_list[], int new_condition)378{379int i;380381for (i=0; i<database->nr; i++)382{383display_list [i] = display_list [i] | bitfield [new_condition];384display_list [i] -= (compare_element [new_condition]) ( & ( (database->entry)[i]), & (cond->entry));385}386return;387}388389void unapply_cond_to_display_list (database *database, int display_list[], int unset_condition)390{391int i;392for (i=0; i<database->nr; i++)393display_list [i] = display_list [i] | bitfield [unset_condition];394}395396database *load_database (const char *filename, int degree)397{398FILE *file;399400int i, j, entries_in_this_file;401402char *complete_name;403404database *datas;405406(display_element [COND_ABBREVIATION]) = display_abbreviation,407(display_element [COND_DEGREE]) = display_degree,408(display_element [COND_SYMBOL]) = display_symbol,409(display_element [COND_ORDER]) = display_order,410(display_element [COND_DISCRIMINANT]) = display_discriminant,411(display_element [COND_ZCLASSES]) = display_zclasses,412(display_element [COND_AFFINE]) = display_affine,413(display_element [COND_TORSIONFREE]) = display_torsionfree,414(display_element [COND_NO_CONCLASS]) = display_no_conclass,415(display_element [COND_NO_IDEM]) = display_no_idem;416417(load_element [COND_ABBREVIATION]) = load_abbreviation,418(load_element [COND_DEGREE]) = load_degree,419(load_element [COND_SYMBOL]) = load_symbol,420(load_element [COND_ORDER]) = load_order,421(load_element [COND_DISCRIMINANT]) = load_discriminant,422(load_element [COND_ZCLASSES]) = load_zclasses,423(load_element [COND_AFFINE]) = load_affine,424(load_element [COND_TORSIONFREE]) = load_torsionfree,425(load_element [COND_NO_CONCLASS]) = load_no_conclass,426(load_element [COND_NO_IDEM]) = load_no_idem;427428(delete_element [COND_ABBREVIATION]) = delete_abbreviation,429(delete_element [COND_DEGREE]) = delete_degree,430(delete_element [COND_SYMBOL]) = delete_symbol,431(delete_element [COND_ORDER]) = delete_order,432(delete_element [COND_DISCRIMINANT]) = delete_discriminant,433(delete_element [COND_ZCLASSES]) = delete_zclasses,434(delete_element [COND_AFFINE]) = delete_affine,435(delete_element [COND_TORSIONFREE]) = delete_torsionfree,436(delete_element [COND_NO_CONCLASS]) = delete_no_conclass,437(delete_element [COND_NO_IDEM]) = delete_no_idem;438439(compare_element [COND_ABBREVIATION]) = cmp_abbreviation,440(compare_element [COND_DEGREE]) = cmp_degree,441(compare_element [COND_SYMBOL]) = cmp_symbol,442(compare_element [COND_ORDER]) = cmp_order,443(compare_element [COND_DISCRIMINANT]) = cmp_discriminant,444(compare_element [COND_ZCLASSES]) = cmp_zclasses,445(compare_element [COND_AFFINE]) = cmp_affine,446(compare_element [COND_TORSIONFREE]) = cmp_torsionfree,447(compare_element [COND_NO_CONCLASS]) = cmp_no_conclass,448(compare_element [COND_NO_IDEM]) = cmp_no_idem;449450name_element [COND_ABBREVIATION] = "abbreviation",451name_element [COND_DEGREE] = "degree",452name_element [COND_SYMBOL] = "symbol",453name_element [COND_ORDER] = "order",454name_element [COND_DISCRIMINANT] = "discriminant",455name_element [COND_ZCLASSES] = "zclasses",456name_element [COND_AFFINE] = "affine_classes",457name_element [COND_TORSIONFREE] = "torsionfree_space_groups",458name_element [COND_NO_CONCLASS] = "con_classes_number",459name_element [COND_NO_IDEM] = "idempotent_number";460461462complete_name = xmalloc ( (strlen(filename) + 16) * sizeof(char), "load_database");463464datas = (database *) xmalloc (sizeof (database), "load_database");465466datas->nr = 0;467468datas->entry = NULL;469470for (i=0; i < 6; i++)471if (degree == 0 || degree == i+1)472{473474(void) sprintf (complete_name, "%s%d",filename,i+1);475476if ( (file = fopen (complete_name, "r") ) == NULL)477{478perror ("Open database-file");479fprintf (stderr, "Could not open: %s\n", complete_name);480exit (4);481}482483if (fscanf (file, "%i\n", &entries_in_this_file) != 1)484{485fprintf (stderr, "Data has wrong structure.\n");486exit (4);487}488489if (datas->entry == NULL)490/* Dieses if wird durch ein BUG in unseren Malloc-Wrappern491notwendig. Denn "realloc" mit uebergegenem Null-Pointer492verhaelt sich so, wie "malloc". Bei unserer Library wird493aber, wird 4 vom Nullpointer abgezogen und dann wird das494eigentlich "realloc" mit Speicherzelle -4 aufgerufen, was495zu einem Segmetation-fault fuehrt. */496datas->entry = (entry *) xmalloc (entries_in_this_file * sizeof (entry), "load_database");497else if ( (datas->entry = (entry *) realloc (datas->entry, (datas->nr + entries_in_this_file) * sizeof (entry)) ) == NULL)498{499perror ("load database");500exit (2);501}502503for (j=0; j < entries_in_this_file; j++)504read_database_entry (file, &(datas->entry [datas->nr + j]) );505506datas->nr += entries_in_this_file;507508if (fclose (file) == EOF)509{510perror ("Closing database-file");511exit (4);512}513514}515516517free (complete_name);518519520521522523524return datas;525}526527void free_database (database *datas)528{529int i, j;530531for (i=0; i<datas->nr; i++)532for (j=0; j<NR_OF_ELEMENTS_IN_EACH_ENTRY; j++)533(delete_element [j]) ( &(datas->entry [i]) );534535536free (datas->entry);537free (datas);538}539540void display_entry (entry *element)541{542int i;543544for (i=0; i<NR_OF_ELEMENTS_IN_EACH_ENTRY; i++)545(display_element [i]) (element);546547fprintf (stdout, "\n");548}549550void display_data_list (database *datas, int display_list[])551{552int i;553554fprintf (stdout,"\n");555556for (i=0; i<NR_OF_ELEMENTS_IN_EACH_ENTRY; i++)557fprintf (stdout,"%s ", name_element [i]);558fprintf (stdout,"\n\n");559560561for (i=0; i<datas->nr; i++)562if (display_list[i] == ALL_MATCH)563display_entry ( &(datas->entry[i]) );564565fprintf (stdout, "\n");566567return;568}569570571