#include #include #include #include #include #include "permut.h" /* Adapte une ligne a permutter avant la permutation Convertit la ligne en minuscule Ellimine les blancs au debut Transforme les tab en blanc et laisse un seul blanc entre chaques mots Retourne la nouvelle longueur de la ligne */ int permut_cnvtxt (char *txt) { char *debtxt = txt; char *copy = txt; int first = 1; while (*txt != '\0' && *txt <= ' ') txt++; while (*txt != '\0'){ if (!first) *copy++ = ' '; first = 0; while (*txt > ' '){ *copy++ = (char)tolower(*txt); txt++; } while (*txt != '\0' && *txt <= ' ') txt++; } *copy = '\0'; return ((int)(copy-debtxt)); } /* S‚pare une ligne en plusieurs item et retourne nombre d'items permut‚s Les items sont accumul‚s dans le vecteur items Les items isol‚s sont des mots uniquement compos‚s de lettres et de caractŠre > 127 Les mots de la table except ne sont pas permuttable, ce sont g‚n‚ralement des articles, pronom, etc... */ int permut_txtline (PERMUT_LINE *line, PERMUT_ITEM *items, char *except[]) { char *txt = line->txt; char *debut = txt; int nbitem = 0; while (*txt != '\0' && !(isalpha(*txt) || *txt > 127)) txt++; while (*txt != '\0'){ char *debmot = txt; int offmot = (int)(txt - debut); if (debmot[1] == '\''){ debmot += 2; txt += 2; offmot += 2; } while (*txt != '\0' && (isalpha(*txt) || *txt > 127)) txt++; items->line = line; items->offmot = offmot; { int lenmot = (int)(txt - debmot); char **pt = except; int accum = 1; while (*pt != NULL){ if (strncmp(*pt,debmot,lenmot)==0){ accum = 0; break; } pt++; } if (accum){ items++; nbitem++; } } while (*txt != '\0' && !isalpha(*txt)) txt++; } return (nbitem); } /* A partir de la liste d'item trie, produit un texte permutte La fonction output genere chaque ligne produite Le mot cle sera place au milieu de la chaine, l'excedant sera ramene au debut. */ void permut_genline ( PERMUT_ITEM *items, int nbitem, int linsiz, void (*output)(char *txt, char *info)) { char buf[300]; int demi = linsiz/2; while (nbitem > 0){ PERMUT_LINE *line = items->line; char *txt = line->txt; int offmot = items->offmot; int lentxt = strlen(txt); memset (buf,' ',linsiz); buf[linsiz] = '\0'; if (offmot >= demi){ int debut = offmot - demi; int len = lentxt - debut; strcpy (buf,txt+debut); buf[len] = '.'; len++; if (len < linsiz){ int reste = linsiz - len; char *debtxt = buf+len; if (reste > debut) debtxt = buf + linsiz - debut-1; *debtxt++ = '>'; strcpy (debtxt,txt); memset (debtxt+debut,' ',linsiz); } }else{ int debut = demi - offmot; int endtxt = debut + lentxt; char *debtxt = buf + debut - 1; if (endtxt > linsiz){ strcpy (buf,txt+linsiz-debut); buf[endtxt-linsiz] = '.'; } *debtxt++ = '>'; strcpy (debtxt,txt); memset (debtxt+lentxt,' ',linsiz); debtxt[lentxt] = '.'; } buf[linsiz] = '\0'; output (buf,line->info); items++; nbitem--; } } static int cmp (const void * pt1, const void *pt2) { #define item1 ((PERMUT_ITEM*)pt1) #define item2 ((PERMUT_ITEM*)pt2) return (str_cmpfranc(item1->line->txt+item1->offmot ,item2->line->txt+item2->offmot)); } /* Tri la table de items permutte */ void permut_tri ( PERMUT_ITEM *items, int nbitem) { qsort (items,nbitem,sizeof(PERMUT_ITEM),cmp); } #ifdef TEST static PERMUT_LINE lines[]={ " Allo comment ca va le monde et toi ", "1", "Je trouve que ca va bien", "2", "Alors pourquoi cette couleur bleu", "3", }; #define NBLINE (sizeof(lines)/sizeof(PERMUT_LINE)) static char *except[]={ "le","les","la","un","une","des", "je","tu","il","nous","vous","ils", "ca","ce","ces","cet","cette","se","ses","sa","ceux", "et","y","de","pour","a","qui","alors","que", NULL}; static void output (char *txt, char *info) { printf (":%s: info :%s:\n",txt,info); } main () { PERMUT_ITEM items[100]; PERMUT_ITEM *ptitem = items; int nbitem = 0; int i; for (i=0; ioffmot] = '^'; } printf ("%s\n",mark); nbitem += nb; ptitem += nb; } permut_tri (items,nbitem); printf ("----------- permutation 40 ------------\n"); permut_genline (items,nbitem,40,output); printf ("----------- permutation 60 ------------\n"); permut_genline (items,nbitem,60,output); } #endif