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
|
#ifndef ALPHIX_H
/*
* Alphabetic indexing class
*/
/*
* Argyll Color Correction System
*
* Author: Graeme W. Gill
* Date: 22/8/2005
*
* Copyright 2005, Graeme W. Gill
* All rights reserved.
*
* This material is licenced under the GNU AFFERO GENERAL PUBLIC LICENSE Version 3 :-
* see the License.txt file for licencing details.
*/
/*
*
* Syntax of alphix pattern:
*
* First comes the definition of the symbols for each digit
* location, LS to MS. The number of definitions declares the
* maximum number of digits. For example, for a normal 2 digit numerical
* sequence: "0123456789, 123456789" (note the space is significant)
* would define 0..99 with the MS digit supressed when it is 0.
* Ranges can be used for brevity: * "0-9, 1-9".
* As a special case, the '@' character can be used
* instead of '0' to indicate suppression of the leading zero.
* Leading ' ' characters in a generated sequence are omitted.
*
* Optional, and delimited by a ';' character, valid segments of the
* index sequence can be defined. For instance, to define the index
* range to be 1..49 one could use the pattern "0-9, 1-9;1-49"
*
* Of course the main reason for using alphix is to allow letter index
* sequences. For a sequence A, B, C .. AA, AB, AC etc. (the default
* used in Argyll), the following pattern would be used: "A-Z, A-Z"
*
* For a some ECI2002R charts that skip columns Y and Z, the following
* might be used: "A-Z, 2-9;A-X,2A-9Z"
*/
#define ALPHIX_MAX 4 /* Maximum digits allowed */
/* Definition for each digit sequence */
typedef struct {
int n; /* Number of characters in sequence */
char *seq; /* Sequence of characters */
int _n; /* Allocation size of seq */
int b; /* Base of this digit */
int z; /* NZ if leading zero is to be supressed */
} dig;
/* Definition for each range sequence */
typedef struct {
int r0,r1; /* Raw index start and end of range */
int c0,c1; /* Cooked index start and end of range */
} rngsq;
struct _alphix {
/* private: */
int nd; /* Number of digits */
dig *ds; /* Digit sequences */
int _nd; /* Allocation size of ds */
int rmct; /* Raw maximum count */
int cmct; /* Cooked maximum count */
int nr; /* Number of ranges */
rngsq *rs; /* Digit sequences */
int _nr; /* Allocation size of rs */
/* public: */
/* Return the maximum possible length of count */
int (*maxlen)(struct _alphix *p);
/* Return the alpha index for the given index number (0 based) */
/* Return NULL on error */
char *(*aix)(struct _alphix *p, int ix);
/* Return the index number for the given alpha index */
/* Return -1 on error */
int (*nix)(struct _alphix *p, char *ax);
/* Destroy ourselves */
void (*del)(struct _alphix *p);
}; typedef struct _alphix alphix;
/* Constructor: */
extern alphix *new_alphix(char *pattern);
/* Utility function: */
/* Given the strip and patch alhix objects, and order flag, */
/* Return a patch location. */
/* Return NULL on error */
char *patch_location(
alphix *saix, /* Strip alpha index object */
alphix *paix, /* Patch alpha index object */
int ixord, /* Index order, 0 = strip then patch */
int six, /* Strip index (from 0) */
int pix); /* Patch index (from 0) */
/* Utility function: */
/* Given the strip and patch alphix objects, and order flag, */
/* and a coresonding patch location string, return an index */
/* number suitable for sorting location strings. */
/* Return -1 on error */
int patch_location_order(
alphix *saix, /* Strip alpha index object */
alphix *paix, /* Patch alpha index object */
int ixord, /* Index order, 0 = strip then patch */
char *_ax); /* Patch location string */
#define ALPHIX_H
#endif /* ALPHIX_H */
|