* Bug 16365 fixed: median(m,'r'|'c') was wrong after 5dc990
[scilab.git] / scilab / modules / completion / src / c / getCommonPart.c
1 /*
2 * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 * Copyright (C) 2008 - DIGITEO - Allan CORNET
4 *
5  * Copyright (C) 2012 - 2016 - Scilab Enterprises
6  *
7  * This file is hereby licensed under the terms of the GNU GPL v2.0,
8  * pursuant to article 5.3.4 of the CeCILL v.2.1.
9  * This file was originally licensed under the terms of the CeCILL v2.1,
10  * and continues to be available under such terms.
11  * For more information, see the COPYING file which you should have received
12  * along with this program.
13 *
14 */
15
16 /*--------------------------------------------------------------------------*/
17 #include <string.h>
18 #include <stdlib.h>
19 #include "getCommonPart.h"
20 #include "core_math.h"
21 #include "sci_malloc.h"
22 #include "os_string.h"
23 /*--------------------------------------------------------------------------*/
24 static int cmp( const void *a , const void *b)
25 {
26     return strcmp(*(char**)a, *(char**)b );
27 }
28 /*--------------------------------------------------------------------------*/
29 static int cmpPos(char *str1, char *str2)
30 {
31     if (str1 && str2)
32     {
33         int i = 0;
34         char *s1 = NULL;
35         char *s2 = NULL;
36         int lenstr1 = (int) strlen(str1);
37         int lenstr2 = (int) strlen(str2);
38         int slen;
39
40         if (lenstr1 > lenstr2)
41         {
42             s1 = str2;
43             s2 = str1;
44             slen = lenstr1;
45             lenstr1 = lenstr2;
46             lenstr2 = slen;
47         }
48         else
49         {
50             s1 = str1;
51             s2 = str2;
52         }
53         for (i = 0; i < lenstr1; i++)
54         {
55             if ( s1[i] != s2[i] )
56             {
57                 return i;
58             }
59         }
60
61         return Min(lenstr1, lenstr2);
62     }
63     return -1;
64 }
65 /*--------------------------------------------------------------------------*/
66 char *getCommonPart(char **dictionary, int sizeDictionary)
67 {
68     char *commonpart = NULL;
69
70     if (sizeDictionary == 1)
71     {
72         return os_strdup(dictionary[0]);
73     }
74
75     if (sizeDictionary >= 2)
76     {
77         int i = 0;
78         int r = 0;
79         char *currentstr = NULL;
80         qsort(dictionary, sizeDictionary, sizeof dictionary[0], cmp);
81         currentstr = dictionary[0];
82
83         r = cmpPos(currentstr, dictionary[1]);
84         for (i = 1; i < sizeDictionary - 1; i++)
85         {
86             int current_r = cmpPos(currentstr, dictionary[i + 1]);
87             if (r > current_r)
88             {
89                 r = current_r;
90                 currentstr = dictionary[i + 1];
91             }
92         }
93
94         commonpart = os_strdup(currentstr);
95         commonpart[r] = '\0';
96     }
97     return commonpart;
98 }
99 /*--------------------------------------------------------------------------*/