File: cdk_display.c

package info (click to toggle)
libcdk5 5.0.20161210-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 3,440 kB
  • ctags: 2,833
  • sloc: ansic: 32,375; sh: 4,732; makefile: 1,122; sed: 43; cpp: 41
file content (131 lines) | stat: -rw-r--r-- 2,576 bytes parent folder | download | duplicates (2)
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include <cdk_int.h>

/*
 * $Author: tom $
 * $Date: 2012/03/20 09:54:37 $
 * $Revision: 1.4 $
 */

/*
 * Given a character pointer, returns the equivalent display type.
 */
EDisplayType char2DisplayType (const char *string)
{
   /* *INDENT-OFF* */
   static const struct {
      const char *name;
      EDisplayType code;
   } table[] = {
      { "CHAR",		vCHAR },
      { "HCHAR",	vHCHAR },
      { "INT",		vINT },
      { "HINT",		vHINT },
      { "UCHAR",	vUCHAR },
      { "LCHAR",	vLCHAR },
      { "UHCHAR",	vUHCHAR },
      { "LHCHAR",	vLHCHAR },
      { "MIXED",	vMIXED },
      { "HMIXED",	vHMIXED },
      { "UMIXED",	vUMIXED },
      { "LMIXED",	vLMIXED },
      { "UHMIXED",	vUHMIXED },
      { "LHMIXED",	vLHMIXED },
      { "VIEWONLY",	vVIEWONLY },
      { 0,		vINVALID },
   };
   /* *INDENT-ON* */

   if (string != 0)
   {
      int n;
      for (n = 0; table[n].name != 0; n++)
      {
	 if (!strcmp (string, table[n].name))
	    return table[n].code;
      }
   }
   return (EDisplayType) vINVALID;
}

/*
 * Tell if a display type is "hidden"
 */
boolean isHiddenDisplayType (EDisplayType type)
{
   boolean result = FALSE;

   switch (type)
   {
   case vHCHAR:
   case vHINT:
   case vHMIXED:
   case vLHCHAR:
   case vLHMIXED:
   case vUHCHAR:
   case vUHMIXED:
      result = TRUE;
      break;
   case vCHAR:
   case vINT:
   case vINVALID:
   case vLCHAR:
   case vLMIXED:
   case vMIXED:
   case vUCHAR:
   case vUMIXED:
   case vVIEWONLY:
      result = FALSE;
      break;
   }
   return result;
}

/*
 * Given a character input, check if it is allowed by the display type,
 * and return the character to apply to the display, or ERR if not.
 */
int filterByDisplayType (EDisplayType type, chtype input)
{
   int result = CharOf (input);

   if (!isChar (input))
   {
      result = ERR;
   }
   else if ((type == vINT ||
	     type == vHINT) &&
	    !isdigit (CharOf (result)))
   {
      result = ERR;
   }
   else if ((type == vCHAR ||
	     type == vUCHAR ||
	     type == vLCHAR ||
	     type == vUHCHAR ||
	     type == vLHCHAR) &&
	    isdigit (CharOf (result)))
   {
      result = ERR;
   }
   else if (type == vVIEWONLY)
   {
      result = ERR;
   }
   else if ((type == vUCHAR ||
	     type == vUHCHAR ||
	     type == vUMIXED ||
	     type == vUHMIXED) &&
	    isalpha (CharOf (result)))
   {
      result = toupper (result);
   }
   else if ((type == vLCHAR ||
	     type == vLHCHAR ||
	     type == vLMIXED ||
	     type == vLHMIXED) &&
	    isalpha (CharOf (result)))
   {
      result = tolower (result);
   }
   return result;
}