79 for (slave = kind->
slave; slave; slave = slave->
slave)
92 size_t len = strlen (rdef->
name);
93 for (
int i = 0; i < len; i++)
97 robj->
free = freefunc;
98 robj->
def->
id = roleId;
110 for (j = 0; j < rcb->
count; j++)
152 for (i = 0; i < rcb->
count; ++i)
165 for (i = 0; i < kcb->
count; ++i)
194 verbose (
"Add kind[%d] \"%c,%s,%s\" to %s\n", def->
id,
205 int roleIndex = rcb->
count++;
210 error (
FATAL,
"Too many role definition for kind \"%s\" of language \"%s\" (> %d)",
240 return kcb->
kind [kindIndex].
def;
251 if (kdef->
letter == letter)
280 if (kdef->
letter == letter)
281 return (
unsigned int)i;
304 return rcb->
role [roleIndex].
def;
308 int kindIndex,
const char*
name)
313 for (i = 0; i <
countRoles (kcb, kindIndex); ++i)
315 rdef =
getRole(kcb, kindIndex, i);
327 slaveKind->
master = masterKind;
337 masterKind->
slave = slaveKind;
346 unsigned int k_slave, k_master;
349 for (k_slave = 0; k_slave <
countKinds (slaveKCB); k_slave++)
351 kind_slave =
getKind(slaveKCB, k_slave);
354 for (k_master = 0; k_master <
countKinds (masterKCB); k_master++)
356 kind_master =
getKind(masterKCB, k_master);
358 && (strcmp (kind_slave->
name, kind_master->
name) == 0))
378 int parentKindIndex,
const char *separator)
386 verbose (
"Installing default separator for %s: %s\n",
394 verbose (
"Installing default root separator for %s: %s\n",
401 "Don't specify a real kind as parent when defining a default scope separator: %d",
460 int kindIndex,
int parentKindIndex)
500 return &defaultSeparator;
513 if (kdef->
letter == letter)
523 "L:REFONLY",
"L:NROLES",
"L:MASTER",
529 const char *langName,
538 :
"ThisShouldNotBePrintedKindNameMustBeGiven");
552 for (
unsigned int i = 0; i <
countKinds (kcb); i++)
565 const char *a_letter;
566 const char *b_letter;
569 r = strcmp (a_parser, b_parser);
575 r = strcmp (a_letter, b_letter);
583 bool withListHeader,
bool machinable, FILE *fp)
593 "L:ENABLED",
"L:DESCRIPTION",
NULL);
597 const char *kindspecs)
604 for (
const char *c = kindspecs; *c !=
'\0'; c++)
606 const char *kname =
NULL;
611 const char *start = c + 1;
612 const char *end = strchr(c,
'}');
615 error (
FATAL,
"'{' is not closed with '}' in \"%s\"", c);
617 error (
FATAL,
"empty kind name is given in \"%s\"", c);
620 kname_len = end - start;
624 for (
unsigned int i = 0; i <
countKinds (kcb); i++)
629 && strlen (k->
name) == kname_len
630 && strncmp (k->
name, kname, kname_len) == 0)
631 || (!kname && *c == k->
letter)
635 for (
unsigned int j = 0; j < nRoles; j++)
660 if ((i ==
countKinds (kcb)) && (*c != KIND_WILDCARD) && (!allowMissingKind))
661 error (
FATAL,
"No such letter kind in %s: %c\n", lang->name, *c);
669 const char *a_parser, *b_parser;
673 r = strcmp(a_parser, b_parser);
677 const char *a_kindln, *b_kindln;
681 r = strcmp(a_kindln, b_kindln);
685 const char *a_role, *b_role;
689 return strcmp(a_role, b_role);
693 bool withListHeader,
bool machinable, FILE *fp)
void colprintLineAppendColumnCString(struct colprintLine *line, const char *column)
void colprintTableSort(struct colprintTable *table, int(*compareFn)(struct colprintLine *, struct colprintLine *))
void colprintLineAppendColumnBool(struct colprintLine *line, bool column)
struct colprintLine * colprintTableGetNewLine(struct colprintTable *table)
struct colprintTable * colprintTableNew(const char *columnHeader,...)
void colprintLineAppendColumnChar(struct colprintLine *line, char column)
void colprintLineAppendColumnVString(struct colprintLine *line, vString *column)
void colprintLineAppendColumnInt(struct colprintLine *line, unsigned int column)
void colprintTablePrint(struct colprintTable *table, unsigned int startFrom, bool withHeader, bool machinable, FILE *fp)
const char * colprintLineGetColumn(struct colprintLine *line, unsigned int column)
void error(const errorSelection selection, const char *const format,...)
static bool tail(const char *cp)
roleDefinition * getRole(struct kindControlBlock *kcb, int kindIndex, int roleIndex)
static void scopeSeparatorDelete(void *data)
void roleColprintAddRoles(struct colprintTable *table, struct kindControlBlock *kcb, const char *kindspecs)
static int roleColprintCompareLines(struct colprintLine *a, struct colprintLine *b)
int getKindIndexForName(struct kindControlBlock *kcb, const char *name)
bool isRoleEnabled(struct kindControlBlock *kcb, int kindIndex, int roleIndex)
kindDefinition * getKindForLetter(struct kindControlBlock *kcb, char letter)
unsigned int countRoles(struct kindControlBlock *kcb, int kindIndex)
struct kindControlBlock * allocKindControlBlock(parserDefinition *parser)
roleDefinition * getRoleForName(struct kindControlBlock *kcb, int kindIndex, const char *name)
struct colprintTable * roleColprintTableNew(void)
unsigned int countKinds(struct kindControlBlock *kcb)
static void kindColprintFillLine(struct colprintLine *line, const char *langName, kindDefinition *kdef)
void kindColprintTablePrint(struct colprintTable *table, bool noparser, bool withListHeader, bool machinable, FILE *fp)
void enableKind(kindDefinition *kind, bool enable)
int defineKind(struct kindControlBlock *kcb, kindDefinition *def, freeKindDefFunc freeKindDef)
const char * renderRole(const roleDefinition *const role, vString *b)
static int kindColprintCompareLines(struct colprintLine *a, struct colprintLine *b)
kindDefinition * getKind(struct kindControlBlock *kcb, int kindIndex)
struct colprintTable * kindColprintTableNew(void)
static void linkKinds(langType master, kindDefinition *masterKind, kindDefinition *slaveKind)
static struct roleControlBlock * allocRoleControlBlock(kindObject *kind)
static scopeSeparator * getScopeSeparatorDynamic(kindObject *kobj, int parentKindIndex)
struct sKindObject kindObject
const scopeSeparator * getScopeSeparator(struct kindControlBlock *kcb, int kindIndex, int parentKindIndex)
void printKind(const kindDefinition *const kind, bool indent)
static const scopeSeparator * getScopeSeparatorStatic(kindDefinition *kdef, int parentKindIndex)
void linkKindDependency(struct kindControlBlock *masterKCB, struct kindControlBlock *slaveKCB)
static void initRoleObject(roleObject *robj, roleDefinition *rdef, freeRoleDefFunc freefunc, int roleId)
void freeKindControlBlock(struct kindControlBlock *kcb)
void enableRole(roleDefinition *role, bool enable)
struct sRoleObject roleObject
int defineScopeSeparator(struct kindControlBlock *kcb, int kindIndex, int parentKindIndex, const char *separator)
static void freeRoleControlBlock(struct roleControlBlock *rcb)
int getKindIndexForLetter(struct kindControlBlock *kcb, char letter)
void roleColprintTablePrint(struct colprintTable *table, bool noparser, bool withListHeader, bool machinable, FILE *fp)
void kindColprintAddLanguageLines(struct colprintTable *table, struct kindControlBlock *kcb)
kindDefinition * getKindForName(struct kindControlBlock *kcb, const char *name)
int defineRole(struct kindControlBlock *kcb, int kindIndex, roleDefinition *def, freeRoleDefFunc freeRoleDef)
#define KIND_WILDCARD_INDEX
#define KIND_WILDCARD_LETTER
void(* freeKindDefFunc)(kindDefinition *)
void(* freeRoleDefFunc)(roleDefinition *)
void verbose(const char *const format,...)
langType getNamedLanguage(const char *const name, size_t len)
const char * getLanguageName(const langType language)
unsigned int countLanguageRoles(const langType language, int kindIndex)
unsigned int ptrArrayCount(const ptrArray *const current)
void * ptrArrayItem(const ptrArray *const current, const unsigned int indx)
ptrArray * ptrArrayNew(ptrArrayDeleteFunc deleteFunc)
void ptrArrayDelete(ptrArray *const current)
unsigned int ptrArrayAdd(ptrArray *const current, void *ptr)
void eFreeNoNullCheck(void *const ptr)
char * eStrdup(const char *str)
void eFree(void *const ptr)
#define xRealloc(p, n, Type)
scopeSeparator defaultScopeSeparator
scopeSeparator defaultRootScopeSeparator
scopeSeparator * separators
unsigned int separatorCount
ptrArray * dynamicSeparators
struct roleControlBlock * rcb
const char * defaultRootScopeSeparator
const char * defaultScopeSeparator
kindDefinition * kindTable
vString * vStringNew(void)
void vStringDelete(vString *const string)
void vStringCatS(vString *const string, const char *const s)
#define vStringClear(string)
static void vStringPut(vString *const string, const int c)