2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these libraries and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
24 * (c) Copyright 1993, 1994 Hewlett-Packard Company *
25 * (c) Copyright 1993, 1994 International Business Machines Corp. *
26 * (c) Copyright 1993, 1994 Sun Microsystems, Inc. *
27 * (c) Copyright 1993, 1994 Novell, Inc. *
32 * $XConsortium: DtsSort.c /main/6 1996/11/21 19:56:08 drk $
34 * RESTRICTED CONFIDENTIAL INFORMATION:
36 * The information in this document is subject to special
37 * restrictions in a confidential disclosure agreement bertween
38 * HP, IBM, Sun, USL, SCO and Univel. Do not distribute this
39 * document outside HP, IBM, Sun, USL, SCO, or Univel wihtout
40 * Sun's specific written approval. This documment and all copies
41 * and derivative works thereof must be returned or destroyed at
44 * Copyright 1993 Sun Microsystems, Inc. All rights reserved.
54 #define X_INCLUDE_STRING_H
55 #define XOS_USE_XT_LOCKING
56 #include <X11/Xos_r.h>
57 #include <Dt/DbReader.h>
61 #if !defined(__linux__)
62 extern char *strdup(const char *);
66 get_value(DtDtsDbRecord *ce_entry, char *value)
69 XrmQuark tmp = XrmStringToQuark (value);
71 for(i = 0; i < ce_entry->fieldCount; i++)
73 if(ce_entry->fieldList[i]->fieldName == tmp)
75 return(ce_entry->fieldList[i]->fieldValue);
82 parts_of_pattern(char *c, int *spec, int *count, int *front)
94 if((len = mblen(c, MB_CUR_MAX)) > 1) {
131 if((len = mblen(c + 1, MB_CUR_MAX)) > 1) {
153 check_pattern(char *value1, char *value2)
155 int spec1 = 0,count1 = 0, front1 = 0;
156 int spec2 = 0,count2 = 0, front2 = 0;
160 parts_of_pattern(value1, &spec1, &count1, &front1);
161 parts_of_pattern(value2, &spec2, &count2, &front2);
163 else if(!value1 && !value2)
179 return(front2 - front1);
184 return(spec1 - spec2);
188 return(count2-count1);
202 if(strchr("fcbdlrwx", *c))
216 if(i < 0) return(-1);
222 static int check_content(char *val1, char *val2)
224 char *v1 = strdup(val1);
225 char *v2 = strdup(val2);
233 _Xstrtokparams strtok_buf;
235 loc1 = _XStrtok(v1, "\t \n", strtok_buf);
236 type1 = _XStrtok(NULL, "\t \n", strtok_buf);
237 cnt1 = &type1[strlen(type1)+1];
238 while(isspace((u_char)*cnt1))cnt1++;
240 loc2 = _XStrtok(v2, "\t \n", strtok_buf);
241 type2 = _XStrtok(NULL, "\t \n", strtok_buf);
242 cnt2 = &type2[strlen(type2)+1];
243 while(isspace((u_char)*cnt2))cnt2++;
245 ret = strcmp(type1, type2);
246 if(loc1 && loc2 && ret == 0)
250 int sl1 = strlen(cnt1);
251 int sl2 = strlen(cnt2);
254 if (sl1 > sl2) ret = -1;
255 else if (sl1 < sl2) ret = 1;
256 else if (l1 > l2 ) ret = 1;
257 else if (l1 < l2 ) ret = -1;
258 else ret = strcmp(cnt1,cnt2);
272 printf("cc (%d,%d) for \"%s\" %c \"%s\"\n", l1, l2, cnt1, sym, cnt2);
281 sfe(DtDtsDbRecord * item1, DtDtsDbRecord * item2)
287 char *value1, *value2;
292 test1 |= get_value(item1, DtDTS_CONTENT) ? 2 : 0;
293 test2 |= get_value(item2, DtDTS_CONTENT) ? 2 : 0;
295 value1 = get_value(item1, DtDTS_NAME_PATTERN);
298 if ((strlen(value1) == 1) && (*value1 == '*'))
308 value2 = get_value(item2, DtDTS_NAME_PATTERN);
311 if ((strlen(value2) == 1) && (*value2 == '*'))
323 test1 |= get_value(item1, DtDTS_PATH_PATTERN) ? 1 : 0;
327 test2 |= get_value(item2, DtDTS_PATH_PATTERN) ? 1 : 0;
364 return (loc1 - loc2);
367 if (loc1 == 2) /* loc1 == loc2 */
369 val = check_pattern(get_value(item1, DtDTS_PATH_PATTERN),
370 get_value(item2, DtDTS_PATH_PATTERN));
375 val = check_pattern(get_value(item1, DtDTS_NAME_PATTERN),
376 get_value(item2, DtDTS_NAME_PATTERN));
385 val = check_content(get_value(item1, DtDTS_CONTENT),
386 get_value(item2, DtDTS_CONTENT));
393 * neither pattern nor content, only needs to compare the
394 * number of fields. If they are equal then which has shorter
395 * record name will be more specific
397 if (item2->fieldCount - item1->fieldCount)
399 return (item2->fieldCount - item1->fieldCount);
402 val = mode_count(get_value(item2, DtDTS_MODE)) -
403 mode_count(get_value(item1, DtDTS_MODE));
410 val = strlen(XrmQuarkToString(item1->recordName)) -
411 strlen(XrmQuarkToString(item2->recordName));
418 return(item1->recordName - item2->recordName);
423 cde_dc_compare(DtDtsDbRecord ** a, DtDtsDbRecord ** b)
425 DtDtsDbRecord **x = (DtDtsDbRecord **) a;
426 DtDtsDbRecord **y = (DtDtsDbRecord **) b;
430 results = sfe(*x, *y);
435 cde_ft_field_value(XrmQuark name_quark)
437 if (name_quark == XrmStringToQuark(DtDTS_PATH_PATTERN))
439 else if (name_quark == XrmStringToQuark(DtDTS_NAME_PATTERN))
441 else if (name_quark == XrmStringToQuark(DtDTS_MODE))
443 else if (name_quark == XrmStringToQuark(DtDTS_LINK_PATH))
445 else if (name_quark == XrmStringToQuark(DtDTS_LINK_NAME))
447 else if (name_quark == XrmStringToQuark(DtDTS_CONTENT))
449 else if (name_quark == XrmStringToQuark(DtDTS_DATA_ATTRIBUTES_NAME))
451 else if (name_quark == XrmStringToQuark(DtDTS_DA_IS_SYNTHETIC))
459 cde_dc_field_compare(DtDtsDbField ** a, DtDtsDbField ** b)
461 return (cde_ft_field_value((*a)->fieldName) -
462 cde_ft_field_value((*b)->fieldName));
465 int cde_da_compare(DtDtsDbRecord ** a, DtDtsDbRecord ** b)
467 int results = ((*a)->recordName) - ((*b)->recordName);
471 results = (*a)->seq - (*b)->seq;