File: TableConvert.c

package info (click to toggle)
swisswatch 0.6-14
  • links: PTS
  • area: main
  • in suites: jessie, jessie-kfreebsd, wheezy
  • size: 292 kB
  • ctags: 362
  • sloc: ansic: 1,987; makefile: 51; sh: 14
file content (104 lines) | stat: -rw-r--r-- 2,913 bytes parent folder | download | duplicates (11)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*****************************************************************************
 * File Name:	 TableConvert.c
 * Description:	 Generic XtRString to Enum Conversion Using Tables
 * Author:	 Simon Leinen (simon@liasun6)
 * Date Created:  5-Jul-91
 * RCS $Header$	 
 * RCS $Log$	 
 ****************************************************************************/

#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include "TableConvert.h"

#if NeedFunctionPrototypes
static Boolean table_convert(Display*,XrmValue*,Cardinal*,XrmValue*,XrmValue*,XtPointer*);
#else /* not NeedFunctionPrototypes */
static Boolean table_convert();
#endif /* not NeedFunctionPrototypes */

typedef struct _InternalLookupTableEntryRec
{
  XrmQuark	quark;
  int		value;
}
InternalLookupTableEntryRec, * InternalLookupTableEntry;

typedef struct _InternalLookupTableRec
{
  InternalLookupTableEntryRec
	      * entries;
  Cardinal	n_entries;
}
InternalLookupTableRec, * InternalLookupTable;

extern void
set_table_converter(to_type,entries,n_entries)
     String to_type;
     LOOKUP_TABLE_ENTRY * entries;
     Cardinal n_entries;
{
  Cardinal k;
  InternalLookupTable internal_lookup_table;
  XtConvertArgList arglist = XtNew(XtConvertArgRec);

  internal_lookup_table = XtNew(InternalLookupTableRec);
  internal_lookup_table->n_entries = n_entries;
  internal_lookup_table->entries
    = (InternalLookupTableEntryRec *)
      XtCalloc(n_entries,sizeof(InternalLookupTableEntryRec));
  for (k=0; k<n_entries; ++k)
    {
      char buffer[1000];
      XmuCopyISOLatin1Lowered(buffer,entries[k].name);
      internal_lookup_table->entries[k].quark = XrmStringToQuark(buffer);
      internal_lookup_table->entries[k].value = entries[k].value;
    }
  arglist[0].address_mode = XtImmediate;
  arglist[0].address_id = (XtPointer) internal_lookup_table;
  arglist[0].size = sizeof internal_lookup_table;
  XtSetTypeConverter(XtRString,to_type,table_convert,
		     arglist,1,
		     XtCacheNone,(XtDestructor)0);
}

static Boolean
table_convert(display,args,n_args,from,to,converter_data)
     Display * display;
     XrmValue * args;
     Cardinal * n_args;
     XrmValue * from;
     XrmValue * to;
     XtPointer * converter_data;
{
  unsigned k;
  char buffer[1000];
  InternalLookupTable table = * (InternalLookupTable *) args[0].addr;
  XrmQuark quark;

  XmuCopyISOLatin1Lowered(buffer,(String) from->addr);
  quark = XrmStringToQuark(buffer);

  for (k = 0; k < table->n_entries; ++k)
    if (quark==table->entries[k].quark)
      {
	if (to->addr!=0)
	  {
	    if (to->size < sizeof(int))
	      {
		to->size = sizeof(int);
		return False;
	      }
	    *(int *) to->addr = table->entries[k].value;
	  }
	else
	  {
	    to->addr = (XtPointer) & table->entries[k].value;
	    to->size = sizeof(int);
	  }
	return True;
      }
  XtDisplayStringConversionWarning
    (display,(char *)from->addr,"AnEnumerationType");
  return False;
}