174a421c4SMasatake YAMATO /*
274a421c4SMasatake YAMATO *
374a421c4SMasatake YAMATO * Copyright (c) 2015, Red Hat, Inc.
474a421c4SMasatake YAMATO * Copyright (c) 2015, Masatake YAMATO
574a421c4SMasatake YAMATO *
674a421c4SMasatake YAMATO * Author: Masatake YAMATO <yamato@redhat.com>
774a421c4SMasatake YAMATO *
874a421c4SMasatake YAMATO * This source code is released for free distribution under the terms of the
974a421c4SMasatake YAMATO * GNU General Public License version 2 or (at your option) any later version.
1074a421c4SMasatake YAMATO *
1174a421c4SMasatake YAMATO */
1274a421c4SMasatake YAMATO
1374a421c4SMasatake YAMATO #include "general.h"
1474a421c4SMasatake YAMATO
15ef287887SMasatake YAMATO #include <ctype.h>
1674a421c4SMasatake YAMATO #include <stdio.h>
1751ebf5f1SMasatake YAMATO #include <string.h>
18db2bf481SMasatake YAMATO
19c08c70d0SMasatake YAMATO #include "colprint_p.h"
20db2bf481SMasatake YAMATO #include "ctags.h"
21519bc47fSMasatake YAMATO #include "debug.h"
2214781660SMasatake YAMATO #include "entry.h"
2374a421c4SMasatake YAMATO #include "kind.h"
240d502ef0SMasatake YAMATO #include "parse_p.h"
25aa1678afSMasatake YAMATO #include "options.h"
26314c9d31SMasatake YAMATO #include "ptrarray.h"
2729e40fb6SMasatake YAMATO #include "routines.h"
28489f37b8SMasatake YAMATO #include "vstring.h"
2974a421c4SMasatake YAMATO
3013457258SMasatake YAMATO typedef struct sRoleObject {
3113457258SMasatake YAMATO roleDefinition *def;
3213457258SMasatake YAMATO freeRoleDefFunc free;
3313457258SMasatake YAMATO } roleObject;
3413457258SMasatake YAMATO
3513457258SMasatake YAMATO struct roleControlBlock {
3613457258SMasatake YAMATO roleObject *role;
3713457258SMasatake YAMATO unsigned int count;
3813457258SMasatake YAMATO int owner;
3913457258SMasatake YAMATO };
4013457258SMasatake YAMATO
417bef4da4SMasatake YAMATO typedef struct sKindObject {
427bef4da4SMasatake YAMATO kindDefinition *def;
437bef4da4SMasatake YAMATO freeKindDefFunc free;
4413457258SMasatake YAMATO struct roleControlBlock *rcb;
45314c9d31SMasatake YAMATO ptrArray * dynamicSeparators;
467bef4da4SMasatake YAMATO } kindObject;
477bef4da4SMasatake YAMATO
487bef4da4SMasatake YAMATO struct kindControlBlock {
497bef4da4SMasatake YAMATO kindObject *kind;
5046ab94ccSMasatake YAMATO unsigned int count;
517bef4da4SMasatake YAMATO langType owner;
525535211dSMasatake YAMATO scopeSeparator defaultScopeSeparator;
535535211dSMasatake YAMATO scopeSeparator defaultRootScopeSeparator;
547bef4da4SMasatake YAMATO };
557bef4da4SMasatake YAMATO
renderRole(const roleDefinition * const role,vString * b)5613457258SMasatake YAMATO extern const char *renderRole (const roleDefinition* const role, vString* b)
57e2755fdeSMasatake YAMATO {
58e2755fdeSMasatake YAMATO vStringCatS (b, role->name);
59e2755fdeSMasatake YAMATO return vStringValue (b);
60e2755fdeSMasatake YAMATO }
61e2755fdeSMasatake YAMATO
printKind(const kindDefinition * const kind,bool indent)629601d44cSMasatake YAMATO extern void printKind (const kindDefinition* const kind, bool indent)
6374a421c4SMasatake YAMATO {
6474a421c4SMasatake YAMATO printf ("%s%c %s%s\n", indent ? " " : "", kind->letter,
6574a421c4SMasatake YAMATO kind->description != NULL ? kind->description :
6674a421c4SMasatake YAMATO (kind->name != NULL ? kind->name : ""),
6774a421c4SMasatake YAMATO kind->enabled ? "" : " [off]");
6874a421c4SMasatake YAMATO }
69908570b8SMasatake YAMATO
enableKind(kindDefinition * kind,bool enable)70e112e8abSMasatake YAMATO extern void enableKind (kindDefinition *kind, bool enable)
71355b5d96SMasatake YAMATO {
72e112e8abSMasatake YAMATO kindDefinition *slave;
73355b5d96SMasatake YAMATO
74355b5d96SMasatake YAMATO if (kind->master)
75355b5d96SMasatake YAMATO enableKind (kind->master, enable);
76355b5d96SMasatake YAMATO else
77355b5d96SMasatake YAMATO {
78355b5d96SMasatake YAMATO kind->enabled = enable;
79355b5d96SMasatake YAMATO for (slave = kind->slave; slave; slave = slave->slave)
80355b5d96SMasatake YAMATO slave->enabled = enable;
81355b5d96SMasatake YAMATO }
82355b5d96SMasatake YAMATO }
837bef4da4SMasatake YAMATO
enableRole(roleDefinition * role,bool enable)847afdb11cSMasatake YAMATO extern void enableRole (roleDefinition *role, bool enable)
857afdb11cSMasatake YAMATO {
867afdb11cSMasatake YAMATO role->enabled = enable;
877afdb11cSMasatake YAMATO }
887afdb11cSMasatake YAMATO
initRoleObject(roleObject * robj,roleDefinition * rdef,freeRoleDefFunc freefunc,int roleId)89ce0ab101SMasatake YAMATO static void initRoleObject (roleObject *robj, roleDefinition *rdef, freeRoleDefFunc freefunc, int roleId)
90ce0ab101SMasatake YAMATO {
91ef287887SMasatake YAMATO #ifdef DEBUG
92ef287887SMasatake YAMATO size_t len = strlen (rdef->name);
93ef287887SMasatake YAMATO for (int i = 0; i < len; i++)
94ef287887SMasatake YAMATO Assert (isalnum (rdef->name [i]));
95ef287887SMasatake YAMATO #endif
96ce0ab101SMasatake YAMATO robj->def = rdef;
97ce0ab101SMasatake YAMATO robj->free = freefunc;
98ce0ab101SMasatake YAMATO robj->def->id = roleId;
99ce0ab101SMasatake YAMATO }
100ce0ab101SMasatake YAMATO
allocRoleControlBlock(kindObject * kind)10113457258SMasatake YAMATO static struct roleControlBlock* allocRoleControlBlock (kindObject *kind)
10213457258SMasatake YAMATO {
10313457258SMasatake YAMATO unsigned int j;
10413457258SMasatake YAMATO struct roleControlBlock* rcb;
10513457258SMasatake YAMATO
10613457258SMasatake YAMATO rcb = xMalloc(1, struct roleControlBlock);
10713457258SMasatake YAMATO rcb->count = kind->def->nRoles;
10813457258SMasatake YAMATO rcb->owner = kind->def->id;
10913457258SMasatake YAMATO rcb->role = xMalloc(rcb->count, roleObject);
11013457258SMasatake YAMATO for (j = 0; j < rcb->count; j++)
111ce0ab101SMasatake YAMATO initRoleObject (rcb->role + j, kind->def->roles + j, NULL, j);
11213457258SMasatake YAMATO
11313457258SMasatake YAMATO return rcb;
11413457258SMasatake YAMATO }
11513457258SMasatake YAMATO
allocKindControlBlock(parserDefinition * parser)1167bef4da4SMasatake YAMATO extern struct kindControlBlock* allocKindControlBlock (parserDefinition *parser)
1177bef4da4SMasatake YAMATO {
1187bef4da4SMasatake YAMATO unsigned int i;
1197bef4da4SMasatake YAMATO struct kindControlBlock *kcb;
1207bef4da4SMasatake YAMATO
1217bef4da4SMasatake YAMATO kcb = xMalloc (1, struct kindControlBlock);
1227bef4da4SMasatake YAMATO kcb->kind = xMalloc (parser->kindCount, kindObject);
1237bef4da4SMasatake YAMATO kcb->count = parser->kindCount;
1247bef4da4SMasatake YAMATO kcb->owner = parser->id;
1257bef4da4SMasatake YAMATO
1265535211dSMasatake YAMATO kcb->defaultScopeSeparator.parentKindIndex = KIND_WILDCARD_INDEX;
1275535211dSMasatake YAMATO kcb->defaultScopeSeparator.separator = NULL;
1285535211dSMasatake YAMATO if (parser->defaultScopeSeparator)
1295535211dSMasatake YAMATO kcb->defaultScopeSeparator.separator = eStrdup (parser->defaultScopeSeparator);
1305535211dSMasatake YAMATO
1315535211dSMasatake YAMATO kcb->defaultRootScopeSeparator.parentKindIndex = KIND_GHOST_INDEX;
1325535211dSMasatake YAMATO kcb->defaultRootScopeSeparator.separator = NULL;
1335535211dSMasatake YAMATO if (parser->defaultRootScopeSeparator)
1345535211dSMasatake YAMATO kcb->defaultRootScopeSeparator.separator = eStrdup (parser->defaultRootScopeSeparator);
1355535211dSMasatake YAMATO
1367bef4da4SMasatake YAMATO for (i = 0; i < parser->kindCount; ++i)
1377bef4da4SMasatake YAMATO {
13813457258SMasatake YAMATO kindObject *kind = kcb->kind + i;
13913457258SMasatake YAMATO kind->def = parser->kindTable + i;
140*7b586ba7SMasatake YAMATO
141*7b586ba7SMasatake YAMATO Assert (kind->def->letter != KIND_FILE_DEFAULT_LETTER);
142*7b586ba7SMasatake YAMATO Assert (kind->def->name == NULL /* SELF (RUNTIME) TEST NEEDS THIS. */
143*7b586ba7SMasatake YAMATO || strcmp(kind->def->name, KIND_FILE_DEFAULT_NAME));
144*7b586ba7SMasatake YAMATO
14513457258SMasatake YAMATO kind->free = NULL;
14613457258SMasatake YAMATO kind->def->id = i;
14713457258SMasatake YAMATO kind->rcb = allocRoleControlBlock (kind);
148314c9d31SMasatake YAMATO kind->dynamicSeparators = NULL;
1497bef4da4SMasatake YAMATO }
1507bef4da4SMasatake YAMATO
1517bef4da4SMasatake YAMATO return kcb;
1527bef4da4SMasatake YAMATO }
1537bef4da4SMasatake YAMATO
freeRoleControlBlock(struct roleControlBlock * rcb)15413457258SMasatake YAMATO static void freeRoleControlBlock (struct roleControlBlock *rcb)
15513457258SMasatake YAMATO {
15613457258SMasatake YAMATO unsigned int i;
15713457258SMasatake YAMATO for (i = 0; i < rcb->count; ++i)
15813457258SMasatake YAMATO {
15913457258SMasatake YAMATO if (rcb->role[i].free)
16013457258SMasatake YAMATO rcb->role [i].free (rcb->role [i].def);
16113457258SMasatake YAMATO }
162a055e2beSMasatake YAMATO eFreeNoNullCheck (rcb->role);
16313457258SMasatake YAMATO eFree (rcb);
16413457258SMasatake YAMATO }
16513457258SMasatake YAMATO
freeKindControlBlock(struct kindControlBlock * kcb)1667bef4da4SMasatake YAMATO extern void freeKindControlBlock (struct kindControlBlock* kcb)
1677bef4da4SMasatake YAMATO {
16846ab94ccSMasatake YAMATO unsigned int i;
1697bef4da4SMasatake YAMATO
1707bef4da4SMasatake YAMATO for (i = 0; i < kcb->count; ++i)
1717bef4da4SMasatake YAMATO {
1727bef4da4SMasatake YAMATO if (kcb->kind [i].free)
1737bef4da4SMasatake YAMATO kcb->kind [i].free (kcb->kind [i].def);
17413457258SMasatake YAMATO freeRoleControlBlock (kcb->kind [i].rcb);
175314c9d31SMasatake YAMATO if (kcb->kind [i].dynamicSeparators)
176314c9d31SMasatake YAMATO ptrArrayDelete(kcb->kind [i].dynamicSeparators);
1777bef4da4SMasatake YAMATO }
1785535211dSMasatake YAMATO
1795535211dSMasatake YAMATO if (kcb->defaultRootScopeSeparator.separator)
1805535211dSMasatake YAMATO eFree((char *)kcb->defaultRootScopeSeparator.separator);
1815535211dSMasatake YAMATO if (kcb->defaultScopeSeparator.separator)
1825535211dSMasatake YAMATO eFree((char *)kcb->defaultScopeSeparator.separator);
1835535211dSMasatake YAMATO
184a055e2beSMasatake YAMATO if (kcb->kind)
1857bef4da4SMasatake YAMATO eFree (kcb->kind);
1867bef4da4SMasatake YAMATO eFree (kcb);
1877bef4da4SMasatake YAMATO }
188aa1678afSMasatake YAMATO
defineKind(struct kindControlBlock * kcb,kindDefinition * def,freeKindDefFunc freeKindDef)189aa1678afSMasatake YAMATO extern int defineKind (struct kindControlBlock* kcb, kindDefinition *def,
190aa1678afSMasatake YAMATO freeKindDefFunc freeKindDef)
191aa1678afSMasatake YAMATO {
192aa1678afSMasatake YAMATO def->id = kcb->count++;
193aa1678afSMasatake YAMATO kcb->kind = xRealloc (kcb->kind, kcb->count, kindObject);
194aa1678afSMasatake YAMATO kcb->kind [def->id].def = def;
195aa1678afSMasatake YAMATO kcb->kind [def->id].free = freeKindDef;
19613457258SMasatake YAMATO kcb->kind [def->id].rcb = allocRoleControlBlock(kcb->kind + def->id);
197314c9d31SMasatake YAMATO kcb->kind [def->id].dynamicSeparators = NULL;
198aa1678afSMasatake YAMATO
199aa1678afSMasatake YAMATO verbose ("Add kind[%d] \"%c,%s,%s\" to %s\n", def->id,
200aa1678afSMasatake YAMATO def->letter, def->name, def->description,
201aa1678afSMasatake YAMATO getLanguageName (kcb->owner));
202aa1678afSMasatake YAMATO
203aa1678afSMasatake YAMATO return def->id;
204aa1678afSMasatake YAMATO }
20522f7a51aSMasatake YAMATO
defineRole(struct kindControlBlock * kcb,int kindIndex,roleDefinition * def,freeRoleDefFunc freeRoleDef)2067adc9db2SMasatake YAMATO extern int defineRole (struct kindControlBlock* kcb, int kindIndex,
2077adc9db2SMasatake YAMATO roleDefinition *def, freeRoleDefFunc freeRoleDef)
2087adc9db2SMasatake YAMATO {
2097adc9db2SMasatake YAMATO struct roleControlBlock *rcb = kcb->kind[kindIndex].rcb;
2107adc9db2SMasatake YAMATO int roleIndex = rcb->count++;
2117adc9db2SMasatake YAMATO
2127adc9db2SMasatake YAMATO if (roleIndex == ROLE_MAX_COUNT)
2137adc9db2SMasatake YAMATO {
2147adc9db2SMasatake YAMATO rcb->count--;
2157adc9db2SMasatake YAMATO error (FATAL, "Too many role definition for kind \"%s\" of language \"%s\" (> %d)",
2167adc9db2SMasatake YAMATO kcb->kind[kindIndex].def->name,
2177adc9db2SMasatake YAMATO getLanguageName (kcb->owner),
2187adc9db2SMasatake YAMATO (int)(ROLE_MAX_COUNT - 1));
2197adc9db2SMasatake YAMATO }
2207adc9db2SMasatake YAMATO
2217adc9db2SMasatake YAMATO rcb->role = xRealloc (rcb->role, rcb->count, roleObject);
222ce0ab101SMasatake YAMATO initRoleObject (rcb->role + roleIndex, def, freeRoleDef, roleIndex);
223ce0ab101SMasatake YAMATO
2247adc9db2SMasatake YAMATO return roleIndex;
2257adc9db2SMasatake YAMATO }
2267adc9db2SMasatake YAMATO
isRoleEnabled(struct kindControlBlock * kcb,int kindIndex,int roleIndex)227320b1e8bSMasatake YAMATO extern bool isRoleEnabled (struct kindControlBlock* kcb, int kindIndex, int roleIndex)
228320b1e8bSMasatake YAMATO {
22913457258SMasatake YAMATO roleDefinition *rdef = getRole (kcb, kindIndex, roleIndex);
23013457258SMasatake YAMATO return rdef->enabled;
231320b1e8bSMasatake YAMATO }
232320b1e8bSMasatake YAMATO
countKinds(struct kindControlBlock * kcb)23346ab94ccSMasatake YAMATO extern unsigned int countKinds (struct kindControlBlock* kcb)
23422f7a51aSMasatake YAMATO {
23522f7a51aSMasatake YAMATO return kcb->count;
23622f7a51aSMasatake YAMATO }
23722f7a51aSMasatake YAMATO
countRoles(struct kindControlBlock * kcb,int kindIndex)2380f23950dSMasatake YAMATO extern unsigned int countRoles (struct kindControlBlock* kcb, int kindIndex)
2390f23950dSMasatake YAMATO {
24013457258SMasatake YAMATO return kcb->kind [kindIndex].rcb->count;
2410f23950dSMasatake YAMATO }
2420f23950dSMasatake YAMATO
getKind(struct kindControlBlock * kcb,int kindIndex)24322f7a51aSMasatake YAMATO extern kindDefinition *getKind (struct kindControlBlock* kcb, int kindIndex)
24422f7a51aSMasatake YAMATO {
24522f7a51aSMasatake YAMATO return kcb->kind [kindIndex].def;
24622f7a51aSMasatake YAMATO }
247b271b49dSMasatake YAMATO
getKindForLetter(struct kindControlBlock * kcb,char letter)248751c4167SMasatake YAMATO extern kindDefinition *getKindForLetter (struct kindControlBlock* kcb, char letter)
2494c4fec28SMasatake YAMATO {
25046ab94ccSMasatake YAMATO unsigned int i;
2514c4fec28SMasatake YAMATO kindDefinition * kdef;
2524c4fec28SMasatake YAMATO
2534c4fec28SMasatake YAMATO for (i = 0; i < countKinds (kcb); ++i)
2544c4fec28SMasatake YAMATO {
2554c4fec28SMasatake YAMATO kdef = getKind (kcb, i);
2564c4fec28SMasatake YAMATO if (kdef->letter == letter)
2574c4fec28SMasatake YAMATO return kdef;
2584c4fec28SMasatake YAMATO }
2594c4fec28SMasatake YAMATO return NULL;
2604c4fec28SMasatake YAMATO }
2614c4fec28SMasatake YAMATO
getKindForName(struct kindControlBlock * kcb,const char * name)26251ebf5f1SMasatake YAMATO extern kindDefinition *getKindForName (struct kindControlBlock* kcb, const char* name)
26351ebf5f1SMasatake YAMATO {
26446ab94ccSMasatake YAMATO unsigned int i;
26551ebf5f1SMasatake YAMATO kindDefinition * kdef;
26651ebf5f1SMasatake YAMATO
26751ebf5f1SMasatake YAMATO for (i = 0; i < countKinds (kcb); ++i)
26851ebf5f1SMasatake YAMATO {
26951ebf5f1SMasatake YAMATO kdef = getKind (kcb, i);
27051ebf5f1SMasatake YAMATO Assert(kdef);
2713acaab1aSMasatake YAMATO if (kdef->name && (strcmp(kdef->name, name) == 0))
27251ebf5f1SMasatake YAMATO return kdef;
27351ebf5f1SMasatake YAMATO }
27451ebf5f1SMasatake YAMATO return NULL;
27551ebf5f1SMasatake YAMATO }
27651ebf5f1SMasatake YAMATO
getKindIndexForLetter(struct kindControlBlock * kcb,char letter)2774f4bbb50SMasatake YAMATO extern int getKindIndexForLetter (struct kindControlBlock* kcb, char letter)
2784f4bbb50SMasatake YAMATO {
2794f4bbb50SMasatake YAMATO unsigned int i;
2804f4bbb50SMasatake YAMATO kindDefinition * kdef;
2814f4bbb50SMasatake YAMATO
2824f4bbb50SMasatake YAMATO for (i = 0; i < countKinds (kcb); ++i)
2834f4bbb50SMasatake YAMATO {
2844f4bbb50SMasatake YAMATO kdef = getKind (kcb, i);
2854f4bbb50SMasatake YAMATO if (kdef->letter == letter)
2864f4bbb50SMasatake YAMATO return (unsigned int)i;
2874f4bbb50SMasatake YAMATO }
2884f4bbb50SMasatake YAMATO return KIND_GHOST_INDEX;
2894f4bbb50SMasatake YAMATO }
2904f4bbb50SMasatake YAMATO
getKindIndexForName(struct kindControlBlock * kcb,const char * name)2914f4bbb50SMasatake YAMATO extern int getKindIndexForName (struct kindControlBlock* kcb, const char* name)
2924f4bbb50SMasatake YAMATO {
2934f4bbb50SMasatake YAMATO unsigned int i;
2944f4bbb50SMasatake YAMATO kindDefinition * kdef;
2954f4bbb50SMasatake YAMATO
2964f4bbb50SMasatake YAMATO for (i = 0; i < countKinds (kcb); ++i)
2974f4bbb50SMasatake YAMATO {
2984f4bbb50SMasatake YAMATO kdef = getKind (kcb, i);
2994f4bbb50SMasatake YAMATO Assert(kdef);
3004f4bbb50SMasatake YAMATO if (kdef->name && (strcmp(kdef->name, name) == 0))
3014f4bbb50SMasatake YAMATO return (int)i;
3024f4bbb50SMasatake YAMATO }
3034f4bbb50SMasatake YAMATO return KIND_GHOST_INDEX;
3044f4bbb50SMasatake YAMATO }
3054f4bbb50SMasatake YAMATO
getRole(struct kindControlBlock * kcb,int kindIndex,int roleIndex)30613457258SMasatake YAMATO extern roleDefinition* getRole(struct kindControlBlock* kcb, int kindIndex, int roleIndex)
30713457258SMasatake YAMATO {
30813457258SMasatake YAMATO struct roleControlBlock *rcb = kcb->kind[kindIndex].rcb;
30913457258SMasatake YAMATO return rcb->role [roleIndex].def;
31013457258SMasatake YAMATO }
31113457258SMasatake YAMATO
getRoleForName(struct kindControlBlock * kcb,int kindIndex,const char * name)3127adc9db2SMasatake YAMATO extern roleDefinition* getRoleForName(struct kindControlBlock* kcb,
3137adc9db2SMasatake YAMATO int kindIndex, const char* name)
3147adc9db2SMasatake YAMATO {
3157adc9db2SMasatake YAMATO unsigned int i;
3167adc9db2SMasatake YAMATO roleDefinition *rdef;
3177adc9db2SMasatake YAMATO
3187adc9db2SMasatake YAMATO for (i = 0; i < countRoles (kcb, kindIndex); ++i)
3197adc9db2SMasatake YAMATO {
3207adc9db2SMasatake YAMATO rdef = getRole(kcb, kindIndex, i);
3217adc9db2SMasatake YAMATO Assert(rdef);
3227adc9db2SMasatake YAMATO if (rdef->name && (strcmp(rdef->name, name) == 0))
3237adc9db2SMasatake YAMATO return rdef;
3247adc9db2SMasatake YAMATO }
3257adc9db2SMasatake YAMATO return NULL;
3267adc9db2SMasatake YAMATO }
3277adc9db2SMasatake YAMATO
linkKinds(langType master,kindDefinition * masterKind,kindDefinition * slaveKind)3289a5a18e6SMasatake YAMATO static void linkKinds (langType master, kindDefinition *masterKind, kindDefinition *slaveKind)
3299a5a18e6SMasatake YAMATO {
3309a5a18e6SMasatake YAMATO kindDefinition *tail;
3319a5a18e6SMasatake YAMATO
3329a5a18e6SMasatake YAMATO slaveKind->master = masterKind;
3339a5a18e6SMasatake YAMATO
3349a5a18e6SMasatake YAMATO tail = slaveKind;
3359a5a18e6SMasatake YAMATO while (tail->slave)
3369a5a18e6SMasatake YAMATO {
3379a5a18e6SMasatake YAMATO tail->enabled = masterKind->enabled;
3389a5a18e6SMasatake YAMATO tail = tail->slave;
3399a5a18e6SMasatake YAMATO }
3409a5a18e6SMasatake YAMATO
3419a5a18e6SMasatake YAMATO tail->slave = masterKind->slave;
3429a5a18e6SMasatake YAMATO masterKind->slave = slaveKind;
3439a5a18e6SMasatake YAMATO
3449a5a18e6SMasatake YAMATO masterKind->syncWith = master;
3459a5a18e6SMasatake YAMATO slaveKind->syncWith = master;
3469a5a18e6SMasatake YAMATO }
3479a5a18e6SMasatake YAMATO
linkKindDependency(struct kindControlBlock * masterKCB,struct kindControlBlock * slaveKCB)3489a5a18e6SMasatake YAMATO extern void linkKindDependency (struct kindControlBlock *masterKCB,
3499a5a18e6SMasatake YAMATO struct kindControlBlock *slaveKCB)
3509a5a18e6SMasatake YAMATO {
3519a5a18e6SMasatake YAMATO unsigned int k_slave, k_master;
3529a5a18e6SMasatake YAMATO kindDefinition *kind_slave, *kind_master;
3539a5a18e6SMasatake YAMATO
3549a5a18e6SMasatake YAMATO for (k_slave = 0; k_slave < countKinds (slaveKCB); k_slave++)
3559a5a18e6SMasatake YAMATO {
3569a5a18e6SMasatake YAMATO kind_slave = getKind(slaveKCB, k_slave);
3579a5a18e6SMasatake YAMATO if (kind_slave->syncWith == LANG_AUTO)
3589a5a18e6SMasatake YAMATO {
3599a5a18e6SMasatake YAMATO for (k_master = 0; k_master < countKinds (masterKCB); k_master++)
3609a5a18e6SMasatake YAMATO {
3619a5a18e6SMasatake YAMATO kind_master = getKind(masterKCB, k_master);
3629a5a18e6SMasatake YAMATO if ((kind_slave->letter == kind_master->letter)
3639a5a18e6SMasatake YAMATO && (strcmp (kind_slave->name, kind_master->name) == 0))
3649a5a18e6SMasatake YAMATO {
3659a5a18e6SMasatake YAMATO linkKinds (masterKCB->owner, kind_master, kind_slave);
3669a5a18e6SMasatake YAMATO break;
3679a5a18e6SMasatake YAMATO }
3689a5a18e6SMasatake YAMATO }
3699a5a18e6SMasatake YAMATO }
3709a5a18e6SMasatake YAMATO }
3719a5a18e6SMasatake YAMATO }
3729a5a18e6SMasatake YAMATO
scopeSeparatorDelete(void * data)373314c9d31SMasatake YAMATO static void scopeSeparatorDelete (void *data)
374314c9d31SMasatake YAMATO {
375314c9d31SMasatake YAMATO scopeSeparator *sep = data;
376314c9d31SMasatake YAMATO eFree ((void *)sep->separator);
377314c9d31SMasatake YAMATO sep->separator = NULL;
378314c9d31SMasatake YAMATO eFree (sep);
379314c9d31SMasatake YAMATO }
380314c9d31SMasatake YAMATO
defineScopeSeparator(struct kindControlBlock * kcb,int kindIndex,int parentKindIndex,const char * separator)381314c9d31SMasatake YAMATO extern int defineScopeSeparator(struct kindControlBlock* kcb,
382314c9d31SMasatake YAMATO int kindIndex,
383314c9d31SMasatake YAMATO int parentKindIndex, const char *separator)
384314c9d31SMasatake YAMATO {
385d76c4e72SMasatake YAMATO if (kindIndex == KIND_WILDCARD_INDEX)
386d76c4e72SMasatake YAMATO {
387d76c4e72SMasatake YAMATO if (parentKindIndex == KIND_WILDCARD_INDEX)
388d76c4e72SMasatake YAMATO {
389d76c4e72SMasatake YAMATO if (kcb->defaultScopeSeparator.separator)
390d76c4e72SMasatake YAMATO eFree ((char *)kcb->defaultScopeSeparator.separator);
391d76c4e72SMasatake YAMATO verbose ("Installing default separator for %s: %s\n",
392d76c4e72SMasatake YAMATO getLanguageName (kcb->owner), separator);
393d76c4e72SMasatake YAMATO kcb->defaultScopeSeparator.separator = eStrdup (separator);
394d76c4e72SMasatake YAMATO }
395d76c4e72SMasatake YAMATO else if (parentKindIndex == KIND_GHOST_INDEX)
396d76c4e72SMasatake YAMATO {
397d76c4e72SMasatake YAMATO if (kcb->defaultRootScopeSeparator.separator)
398d76c4e72SMasatake YAMATO eFree ((char *)kcb->defaultRootScopeSeparator.separator);
399d76c4e72SMasatake YAMATO verbose ("Installing default root separator for %s: %s\n",
400d76c4e72SMasatake YAMATO getLanguageName (kcb->owner),
401d76c4e72SMasatake YAMATO separator);
402d76c4e72SMasatake YAMATO kcb->defaultRootScopeSeparator.separator = eStrdup (separator);
403d76c4e72SMasatake YAMATO }
404d76c4e72SMasatake YAMATO else
405d76c4e72SMasatake YAMATO error (FATAL,
406d76c4e72SMasatake YAMATO "Don't specify a real kind as parent when defining a default scope separator: %d",
407d76c4e72SMasatake YAMATO parentKindIndex);
408d76c4e72SMasatake YAMATO return 0;
409d76c4e72SMasatake YAMATO }
410314c9d31SMasatake YAMATO Assert (kcb->count > kindIndex);
411314c9d31SMasatake YAMATO kindObject *kind = kcb->kind + kindIndex;
412314c9d31SMasatake YAMATO
413314c9d31SMasatake YAMATO if (!kind->dynamicSeparators)
414314c9d31SMasatake YAMATO kind->dynamicSeparators = ptrArrayNew (scopeSeparatorDelete);
415314c9d31SMasatake YAMATO
416314c9d31SMasatake YAMATO scopeSeparator *sep = xMalloc (1, scopeSeparator);
417314c9d31SMasatake YAMATO sep->parentKindIndex = parentKindIndex;
418314c9d31SMasatake YAMATO sep->separator = eStrdup(separator);
419314c9d31SMasatake YAMATO ptrArrayAdd (kind->dynamicSeparators, sep);
420314c9d31SMasatake YAMATO
421314c9d31SMasatake YAMATO return 0;
422314c9d31SMasatake YAMATO }
423314c9d31SMasatake YAMATO
getScopeSeparatorDynamic(kindObject * kobj,int parentKindIndex)424314c9d31SMasatake YAMATO static scopeSeparator *getScopeSeparatorDynamic(kindObject *kobj, int parentKindIndex)
425314c9d31SMasatake YAMATO {
426314c9d31SMasatake YAMATO scopeSeparator *sep;
427314c9d31SMasatake YAMATO
428314c9d31SMasatake YAMATO if (kobj->dynamicSeparators)
429314c9d31SMasatake YAMATO {
430314c9d31SMasatake YAMATO for (unsigned int i = ptrArrayCount (kobj->dynamicSeparators); 0 < i ; i--)
431314c9d31SMasatake YAMATO {
432314c9d31SMasatake YAMATO sep = ptrArrayItem (kobj->dynamicSeparators, i - 1);
433314c9d31SMasatake YAMATO if (sep->parentKindIndex == parentKindIndex)
434314c9d31SMasatake YAMATO return sep;
435314c9d31SMasatake YAMATO }
436314c9d31SMasatake YAMATO }
437314c9d31SMasatake YAMATO return NULL;
438314c9d31SMasatake YAMATO }
439314c9d31SMasatake YAMATO
getScopeSeparatorStatic(kindDefinition * kdef,int parentKindIndex)440314c9d31SMasatake YAMATO static const scopeSeparator *getScopeSeparatorStatic(kindDefinition *kdef, int parentKindIndex)
441314c9d31SMasatake YAMATO {
442314c9d31SMasatake YAMATO scopeSeparator *table = kdef->separators;
443314c9d31SMasatake YAMATO
444314c9d31SMasatake YAMATO if (table == NULL)
4457f1a44dbSMasatake YAMATO return NULL;
446314c9d31SMasatake YAMATO
447314c9d31SMasatake YAMATO while (table - kdef->separators < (int)kdef->separatorCount)
448314c9d31SMasatake YAMATO {
449d395bfa6SMasatake YAMATO if (table->parentKindIndex == parentKindIndex)
450314c9d31SMasatake YAMATO return table;
451d395bfa6SMasatake YAMATO
452d395bfa6SMasatake YAMATO /* If a caller wants a root separator for kdef,
453d395bfa6SMasatake YAMATO we should not return a wildcard table. */
454d395bfa6SMasatake YAMATO if (parentKindIndex != KIND_GHOST_INDEX
455d395bfa6SMasatake YAMATO && table->parentKindIndex == KIND_WILDCARD_INDEX)
456d395bfa6SMasatake YAMATO return table;
457d395bfa6SMasatake YAMATO
458314c9d31SMasatake YAMATO table++;
459314c9d31SMasatake YAMATO }
4607f1a44dbSMasatake YAMATO
461314c9d31SMasatake YAMATO return NULL;
462314c9d31SMasatake YAMATO }
463314c9d31SMasatake YAMATO
getScopeSeparator(struct kindControlBlock * kcb,int kindIndex,int parentKindIndex)464314c9d31SMasatake YAMATO extern const scopeSeparator *getScopeSeparator(struct kindControlBlock* kcb,
465314c9d31SMasatake YAMATO int kindIndex, int parentKindIndex)
466314c9d31SMasatake YAMATO {
467b43718bfSMasatake YAMATO Assert (kindIndex != KIND_GHOST_INDEX);
468b43718bfSMasatake YAMATO Assert (kindIndex != KIND_FILE_INDEX);
469b43718bfSMasatake YAMATO Assert (kindIndex != KIND_WILDCARD_INDEX);
470b43718bfSMasatake YAMATO
471b43718bfSMasatake YAMATO Assert (parentKindIndex != KIND_WILDCARD_INDEX);
472b43718bfSMasatake YAMATO Assert (parentKindIndex != KIND_FILE_INDEX);
473b43718bfSMasatake YAMATO /* A caller specifies KIND_GHOST_INDEX for parentKindIndex when it
474b43718bfSMasatake YAMATO * wants root separator. */
475b43718bfSMasatake YAMATO
476314c9d31SMasatake YAMATO Assert (kcb->count > kindIndex);
477314c9d31SMasatake YAMATO kindObject *kobj = kcb->kind + kindIndex;
4787f1a44dbSMasatake YAMATO const scopeSeparator *sep;
479314c9d31SMasatake YAMATO
4807f1a44dbSMasatake YAMATO sep = getScopeSeparatorDynamic (kobj, parentKindIndex);
481314c9d31SMasatake YAMATO if (sep)
482314c9d31SMasatake YAMATO return sep;
483314c9d31SMasatake YAMATO
4847f1a44dbSMasatake YAMATO sep = getScopeSeparatorStatic (kobj->def, parentKindIndex);
4857f1a44dbSMasatake YAMATO if (sep)
4867f1a44dbSMasatake YAMATO return sep;
4877f1a44dbSMasatake YAMATO
488ebdbd8e2SK.Takata /* Cannot find a suitable sep definition.
4897f1a44dbSMasatake YAMATO * Use default one. */
4907f1a44dbSMasatake YAMATO if (parentKindIndex == KIND_GHOST_INDEX)
4915535211dSMasatake YAMATO {
4925535211dSMasatake YAMATO if (kcb->defaultRootScopeSeparator.separator)
4935535211dSMasatake YAMATO return &kcb->defaultRootScopeSeparator;
4947f1a44dbSMasatake YAMATO return NULL;
4955535211dSMasatake YAMATO }
4967f1a44dbSMasatake YAMATO else
4977f1a44dbSMasatake YAMATO {
4985535211dSMasatake YAMATO if (kcb->defaultScopeSeparator.separator)
4995535211dSMasatake YAMATO return &kcb->defaultScopeSeparator;
5005535211dSMasatake YAMATO
5017f1a44dbSMasatake YAMATO static scopeSeparator defaultSeparator = {
5027f1a44dbSMasatake YAMATO .separator = ".",
5037f1a44dbSMasatake YAMATO .parentKindIndex = KIND_WILDCARD_INDEX,
5047f1a44dbSMasatake YAMATO };
5057f1a44dbSMasatake YAMATO return &defaultSeparator;
5067f1a44dbSMasatake YAMATO }
507314c9d31SMasatake YAMATO }
508314c9d31SMasatake YAMATO
509b271b49dSMasatake YAMATO #ifdef DEBUG
doesParserUseKind(struct kindControlBlock * kcb,char letter)510b271b49dSMasatake YAMATO extern bool doesParserUseKind (struct kindControlBlock* kcb, char letter)
511b271b49dSMasatake YAMATO {
512b271b49dSMasatake YAMATO unsigned int k;
513b271b49dSMasatake YAMATO kindDefinition *kdef;
514b271b49dSMasatake YAMATO
515b271b49dSMasatake YAMATO for (k = 0; k < countKinds (kcb); k++)
516b271b49dSMasatake YAMATO {
517b271b49dSMasatake YAMATO kdef = getKind(kcb, k);
518b271b49dSMasatake YAMATO if (kdef->letter == letter)
519b271b49dSMasatake YAMATO return true;
520b271b49dSMasatake YAMATO }
521b271b49dSMasatake YAMATO return false;
522b271b49dSMasatake YAMATO }
523b271b49dSMasatake YAMATO #endif
5249601d44cSMasatake YAMATO
kindColprintTableNew(void)5259601d44cSMasatake YAMATO extern struct colprintTable * kindColprintTableNew (void)
5269601d44cSMasatake YAMATO {
527ef280d2fSMasatake YAMATO return colprintTableNew ("L:LANGUAGE", "L:LETTER", "L:NAME", "L:ENABLED",
5289601d44cSMasatake YAMATO "L:REFONLY", "L:NROLES", "L:MASTER",
5299601d44cSMasatake YAMATO "L:DESCRIPTION",
5309601d44cSMasatake YAMATO NULL);
5319601d44cSMasatake YAMATO }
5329601d44cSMasatake YAMATO
kindColprintFillLine(struct colprintLine * line,const char * langName,kindDefinition * kdef)5332082dbbfSColomban Wendling static void kindColprintFillLine (struct colprintLine *line,
53413457258SMasatake YAMATO const char *langName,
5359601d44cSMasatake YAMATO kindDefinition *kdef)
5369601d44cSMasatake YAMATO {
53713457258SMasatake YAMATO langType lang = getNamedLanguage (langName, 0);
53813457258SMasatake YAMATO unsigned int count = countLanguageRoles(lang, kdef->id);
53913457258SMasatake YAMATO colprintLineAppendColumnCString (line, langName);
5409601d44cSMasatake YAMATO colprintLineAppendColumnChar (line, kdef->letter);
5419601d44cSMasatake YAMATO colprintLineAppendColumnCString (line, kdef->name
5429601d44cSMasatake YAMATO ? kdef->name
5439601d44cSMasatake YAMATO : "ThisShouldNotBePrintedKindNameMustBeGiven");
544232cabfcSMasatake YAMATO colprintLineAppendColumnBool (line, kdef->enabled);
545232cabfcSMasatake YAMATO colprintLineAppendColumnBool (line, kdef->referenceOnly);
54613457258SMasatake YAMATO colprintLineAppendColumnInt (line, count);
5479601d44cSMasatake YAMATO colprintLineAppendColumnCString (line, (kdef->master
5489601d44cSMasatake YAMATO || kdef->slave ) ?
549db2bf481SMasatake YAMATO getLanguageName (kdef->syncWith): RSV_NONE);
5509601d44cSMasatake YAMATO colprintLineAppendColumnCString (line, kdef->description? kdef->description: "NO DESCRIPTION GIVEN");
5519601d44cSMasatake YAMATO }
5529601d44cSMasatake YAMATO
kindColprintAddLanguageLines(struct colprintTable * table,struct kindControlBlock * kcb)5539601d44cSMasatake YAMATO extern void kindColprintAddLanguageLines (struct colprintTable *table,
5549601d44cSMasatake YAMATO struct kindControlBlock* kcb)
5559601d44cSMasatake YAMATO {
5569601d44cSMasatake YAMATO const char *lang = getLanguageName (kcb->owner);
5579601d44cSMasatake YAMATO for (unsigned int i = 0; i < countKinds (kcb); i++)
5589601d44cSMasatake YAMATO {
5599601d44cSMasatake YAMATO kindDefinition *kdef = getKind (kcb, i);
5609601d44cSMasatake YAMATO struct colprintLine *line = colprintTableGetNewLine(table);
5619601d44cSMasatake YAMATO
5629601d44cSMasatake YAMATO kindColprintFillLine (line, lang, kdef);
5639601d44cSMasatake YAMATO }
5649601d44cSMasatake YAMATO }
5659601d44cSMasatake YAMATO
kindColprintCompareLines(struct colprintLine * a,struct colprintLine * b)5669601d44cSMasatake YAMATO static int kindColprintCompareLines (struct colprintLine *a , struct colprintLine *b)
5679601d44cSMasatake YAMATO {
5689601d44cSMasatake YAMATO const char *a_parser = colprintLineGetColumn (a, 0);
5699601d44cSMasatake YAMATO const char *b_parser = colprintLineGetColumn (b, 0);
5709601d44cSMasatake YAMATO const char *a_letter;
5719601d44cSMasatake YAMATO const char *b_letter;
5729601d44cSMasatake YAMATO int r;
5739601d44cSMasatake YAMATO
5749601d44cSMasatake YAMATO r = strcmp (a_parser, b_parser);
5759601d44cSMasatake YAMATO if (r != 0)
5769601d44cSMasatake YAMATO return r;
5779601d44cSMasatake YAMATO
5789601d44cSMasatake YAMATO a_letter = colprintLineGetColumn (a, 1);
5799601d44cSMasatake YAMATO b_letter = colprintLineGetColumn (b, 1);
5809601d44cSMasatake YAMATO r = strcmp (a_letter, b_letter);
5819601d44cSMasatake YAMATO if (r != 0)
5829601d44cSMasatake YAMATO return r;
5839601d44cSMasatake YAMATO
5849601d44cSMasatake YAMATO return 0;
5859601d44cSMasatake YAMATO }
5869601d44cSMasatake YAMATO
kindColprintTablePrint(struct colprintTable * table,bool noparser,bool withListHeader,bool machinable,FILE * fp)5879601d44cSMasatake YAMATO extern void kindColprintTablePrint (struct colprintTable *table, bool noparser,
5889601d44cSMasatake YAMATO bool withListHeader, bool machinable, FILE *fp)
5899601d44cSMasatake YAMATO {
5909601d44cSMasatake YAMATO colprintTableSort (table, kindColprintCompareLines);
5919601d44cSMasatake YAMATO colprintTablePrint (table, noparser? 1: 0, withListHeader, machinable, fp);
5929601d44cSMasatake YAMATO }
593489f37b8SMasatake YAMATO
594489f37b8SMasatake YAMATO
roleColprintTableNew(void)595489f37b8SMasatake YAMATO extern struct colprintTable * roleColprintTableNew (void)
596489f37b8SMasatake YAMATO {
597489f37b8SMasatake YAMATO return colprintTableNew ("L:LANGUAGE", "L:KIND(L/N)", "L:NAME",
598489f37b8SMasatake YAMATO "L:ENABLED", "L:DESCRIPTION", NULL);
599489f37b8SMasatake YAMATO }
600489f37b8SMasatake YAMATO
roleColprintAddRoles(struct colprintTable * table,struct kindControlBlock * kcb,const char * kindspecs)601489f37b8SMasatake YAMATO extern void roleColprintAddRoles (struct colprintTable *table, struct kindControlBlock *kcb,
6026348dd8fSMasatake YAMATO const char *kindspecs)
603489f37b8SMasatake YAMATO {
604489f37b8SMasatake YAMATO const char* lang;
605489f37b8SMasatake YAMATO vString *kind_l_and_n;
606489f37b8SMasatake YAMATO
607489f37b8SMasatake YAMATO lang = getLanguageName (kcb->owner);
608489f37b8SMasatake YAMATO kind_l_and_n = vStringNew ();
6096348dd8fSMasatake YAMATO for (const char *c = kindspecs; *c != '\0'; c++)
610489f37b8SMasatake YAMATO {
6116348dd8fSMasatake YAMATO const char *kname = NULL;
6126348dd8fSMasatake YAMATO size_t kname_len;
6136348dd8fSMasatake YAMATO
6146348dd8fSMasatake YAMATO if (*c == '{')
6156348dd8fSMasatake YAMATO {
6166348dd8fSMasatake YAMATO const char *start = c + 1;
6176348dd8fSMasatake YAMATO const char *end = strchr(c, '}');
6186348dd8fSMasatake YAMATO
6196348dd8fSMasatake YAMATO if (!end)
6206348dd8fSMasatake YAMATO error (FATAL, "'{' is not closed with '}' in \"%s\"", c);
6216348dd8fSMasatake YAMATO if (start == end)
6226348dd8fSMasatake YAMATO error (FATAL, "empty kind name is given in \"%s\"", c);
6236348dd8fSMasatake YAMATO
6246348dd8fSMasatake YAMATO kname = start;
6256348dd8fSMasatake YAMATO kname_len = end - start;
6266348dd8fSMasatake YAMATO c = end;
6276348dd8fSMasatake YAMATO }
6286348dd8fSMasatake YAMATO
629489f37b8SMasatake YAMATO for (unsigned int i = 0; i < countKinds (kcb); i++)
630489f37b8SMasatake YAMATO {
631489f37b8SMasatake YAMATO const kindDefinition *k = getKind (kcb, i);
6326348dd8fSMasatake YAMATO
6336348dd8fSMasatake YAMATO if ((kname
6346348dd8fSMasatake YAMATO && strlen (k->name) == kname_len
6356348dd8fSMasatake YAMATO && strncmp (k->name, kname, kname_len) == 0)
6366348dd8fSMasatake YAMATO || (!kname && *c == k->letter)
6377e1bd430SMasatake YAMATO || (!kname && *c == KIND_WILDCARD_LETTER))
638489f37b8SMasatake YAMATO {
63913457258SMasatake YAMATO unsigned int nRoles = countRoles(kcb, i);
6404c64e833SMasatake YAMATO for (unsigned int j = 0; j < nRoles; j++)
641489f37b8SMasatake YAMATO {
64213457258SMasatake YAMATO const roleDefinition *r = getRole (kcb, i, j);
643489f37b8SMasatake YAMATO struct colprintLine *line = colprintTableGetNewLine(table);
644489f37b8SMasatake YAMATO
645489f37b8SMasatake YAMATO colprintLineAppendColumnCString (line, lang);
646489f37b8SMasatake YAMATO
647489f37b8SMasatake YAMATO vStringPut (kind_l_and_n, k->letter);
648489f37b8SMasatake YAMATO vStringPut (kind_l_and_n, '/');
649489f37b8SMasatake YAMATO vStringCatS (kind_l_and_n, k->name);
650489f37b8SMasatake YAMATO colprintLineAppendColumnVString (line, kind_l_and_n);
651489f37b8SMasatake YAMATO vStringClear (kind_l_and_n);
652489f37b8SMasatake YAMATO
653489f37b8SMasatake YAMATO colprintLineAppendColumnCString (line, r->name);
654489f37b8SMasatake YAMATO colprintLineAppendColumnCString (line,
655489f37b8SMasatake YAMATO r->enabled ? "on" : "off");
656489f37b8SMasatake YAMATO colprintLineAppendColumnCString (line, r->description);
657489f37b8SMasatake YAMATO }
6587e1bd430SMasatake YAMATO if (! (!kname && *c == KIND_WILDCARD_LETTER))
659489f37b8SMasatake YAMATO break;
660489f37b8SMasatake YAMATO }
661489f37b8SMasatake YAMATO }
662489f37b8SMasatake YAMATO }
663489f37b8SMasatake YAMATO vStringDelete (kind_l_and_n);
664489f37b8SMasatake YAMATO #if 0
665489f37b8SMasatake YAMATO if ((i == countKinds (kcb)) && (*c != KIND_WILDCARD) && (!allowMissingKind))
666489f37b8SMasatake YAMATO error (FATAL, "No such letter kind in %s: %c\n", lang->name, *c);
667489f37b8SMasatake YAMATO #endif
668489f37b8SMasatake YAMATO }
669489f37b8SMasatake YAMATO
roleColprintCompareLines(struct colprintLine * a,struct colprintLine * b)670489f37b8SMasatake YAMATO static int roleColprintCompareLines(struct colprintLine *a, struct colprintLine *b)
671489f37b8SMasatake YAMATO {
672489f37b8SMasatake YAMATO int r;
673489f37b8SMasatake YAMATO
674489f37b8SMasatake YAMATO const char *a_parser, *b_parser;
675489f37b8SMasatake YAMATO a_parser = colprintLineGetColumn (a, 0);
676489f37b8SMasatake YAMATO b_parser = colprintLineGetColumn (b, 0);
677489f37b8SMasatake YAMATO
678489f37b8SMasatake YAMATO r = strcmp(a_parser, b_parser);
679489f37b8SMasatake YAMATO if (r != 0)
680489f37b8SMasatake YAMATO return r;
681489f37b8SMasatake YAMATO
682489f37b8SMasatake YAMATO const char *a_kindln, *b_kindln;
683489f37b8SMasatake YAMATO a_kindln = colprintLineGetColumn (a, 1);
684489f37b8SMasatake YAMATO b_kindln = colprintLineGetColumn (b, 1);
685489f37b8SMasatake YAMATO
686489f37b8SMasatake YAMATO r = strcmp(a_kindln, b_kindln);
687489f37b8SMasatake YAMATO if (r != 0)
688489f37b8SMasatake YAMATO return r;
689489f37b8SMasatake YAMATO
690489f37b8SMasatake YAMATO const char *a_role, *b_role;
691489f37b8SMasatake YAMATO a_role = colprintLineGetColumn (a, 2);
692489f37b8SMasatake YAMATO b_role = colprintLineGetColumn (b, 2);
693489f37b8SMasatake YAMATO
694489f37b8SMasatake YAMATO return strcmp(a_role, b_role);
695489f37b8SMasatake YAMATO }
696489f37b8SMasatake YAMATO
roleColprintTablePrint(struct colprintTable * table,bool noparser,bool withListHeader,bool machinable,FILE * fp)697489f37b8SMasatake YAMATO extern void roleColprintTablePrint (struct colprintTable *table, bool noparser,
698489f37b8SMasatake YAMATO bool withListHeader, bool machinable, FILE *fp)
699489f37b8SMasatake YAMATO {
700489f37b8SMasatake YAMATO colprintTableSort (table, roleColprintCompareLines);
701489f37b8SMasatake YAMATO colprintTablePrint (table, noparser? 1: 0, withListHeader, machinable, fp);
702489f37b8SMasatake YAMATO }
703