xref: /Universal-ctags/parsers/abaqus.c (revision c62be1479922a47ac46d4d6827d9fb6b78759148)
1*c62be147SJiří Techet /*
2*c62be147SJiří Techet  *   Copyright (c) 2013, Baptiste Pierrat
3*c62be147SJiří Techet  *
4*c62be147SJiří Techet  *   This source code is released for free distribution under the terms of the
5*c62be147SJiří Techet  *   GNU General Public License version 2 or (at your opinion) any later version.
6*c62be147SJiří Techet  *
7*c62be147SJiří Techet  *   This module contains functions for generating tags for source files
8*c62be147SJiří Techet  *   for Abaqus inp files (https://en.wikipedia.org/wiki/Abaqus).
9*c62be147SJiří Techet  */
10*c62be147SJiří Techet 
11*c62be147SJiří Techet /*
12*c62be147SJiří Techet *   INCLUDE FILES
13*c62be147SJiří Techet */
14*c62be147SJiří Techet #include "general.h"	/* must always come first */
15*c62be147SJiří Techet 
16*c62be147SJiří Techet #include <ctype.h>
17*c62be147SJiří Techet #include <string.h>
18*c62be147SJiří Techet 
19*c62be147SJiří Techet #include "parse.h"
20*c62be147SJiří Techet #include "read.h"
21*c62be147SJiří Techet #include "vstring.h"
22*c62be147SJiří Techet #include "routines.h"
23*c62be147SJiří Techet 
24*c62be147SJiří Techet /*
25*c62be147SJiří Techet *   DATA DEFINITIONS
26*c62be147SJiří Techet */
27*c62be147SJiří Techet typedef enum {
28*c62be147SJiří Techet 	K_PART,
29*c62be147SJiří Techet 	K_ASSEMBLY,
30*c62be147SJiří Techet 	K_STEP
31*c62be147SJiří Techet } AbaqusKind;
32*c62be147SJiří Techet 
33*c62be147SJiří Techet static kindDefinition AbaqusKinds[] = {
34*c62be147SJiří Techet      { true, 'p', "part",     "Parts" },
35*c62be147SJiří Techet      { true, 'a', "assembly", "Assembly" },
36*c62be147SJiří Techet      { true, 's', "step",     "Steps" }
37*c62be147SJiří Techet };
38*c62be147SJiří Techet 
39*c62be147SJiří Techet /*
40*c62be147SJiří Techet *   FUNCTION DEFINITIONS
41*c62be147SJiří Techet */
42*c62be147SJiří Techet 
getWord(const char * ref,const char ** ptr)43*c62be147SJiří Techet static int getWord(const char *ref, const char **ptr)
44*c62be147SJiří Techet {
45*c62be147SJiří Techet 	const char *p = *ptr;
46*c62be147SJiří Techet 
47*c62be147SJiří Techet 	while ((*ref != '\0') && (*p != '\0') && (tolower(*ref) == tolower(*p))) ref++, p++;
48*c62be147SJiří Techet 
49*c62be147SJiří Techet 	if (*ref) return false;
50*c62be147SJiří Techet 
51*c62be147SJiří Techet 	*ptr = p;
52*c62be147SJiří Techet 	return true;
53*c62be147SJiří Techet }
54*c62be147SJiří Techet 
55*c62be147SJiří Techet 
createTag(AbaqusKind kind,const char * buf)56*c62be147SJiří Techet static void createTag(AbaqusKind kind, const char *buf)
57*c62be147SJiří Techet {
58*c62be147SJiří Techet 	vString *name;
59*c62be147SJiří Techet 
60*c62be147SJiří Techet 	if (*buf == '\0') return;
61*c62be147SJiří Techet 
62*c62be147SJiří Techet 	buf = strstr(buf, "=");
63*c62be147SJiří Techet 	if (buf == NULL) return;
64*c62be147SJiří Techet 
65*c62be147SJiří Techet 	buf += 1;
66*c62be147SJiří Techet 
67*c62be147SJiří Techet 	if (*buf == '\0') return;
68*c62be147SJiří Techet 
69*c62be147SJiří Techet 	name = vStringNew();
70*c62be147SJiří Techet 
71*c62be147SJiří Techet 	do
72*c62be147SJiří Techet 	{
73*c62be147SJiří Techet 		vStringPut(name, (int) *buf);
74*c62be147SJiří Techet 		++buf;
75*c62be147SJiří Techet 	} while ((*buf != '\0') && (*buf != ','));
76*c62be147SJiří Techet 	makeSimpleTag(name, kind);
77*c62be147SJiří Techet 	vStringDelete(name);
78*c62be147SJiří Techet }
79*c62be147SJiří Techet 
80*c62be147SJiří Techet 
findAbaqusTags(void)81*c62be147SJiří Techet static void findAbaqusTags(void)
82*c62be147SJiří Techet {
83*c62be147SJiří Techet 	const char *line;
84*c62be147SJiří Techet 
85*c62be147SJiří Techet 	while ((line = (const char*)readLineFromInputFile()) != NULL)
86*c62be147SJiří Techet 	{
87*c62be147SJiří Techet 		const char *cp = line;
88*c62be147SJiří Techet 
89*c62be147SJiří Techet 		for (; *cp != '\0'; cp++)
90*c62be147SJiří Techet 		{
91*c62be147SJiří Techet 			if (*cp == '*')
92*c62be147SJiří Techet 			{
93*c62be147SJiří Techet 				cp++;
94*c62be147SJiří Techet 
95*c62be147SJiří Techet 				/* Parts*/
96*c62be147SJiří Techet 				if (getWord("part", &cp))
97*c62be147SJiří Techet 				{
98*c62be147SJiří Techet 					createTag(K_PART, cp);
99*c62be147SJiří Techet 					continue;
100*c62be147SJiří Techet 				}
101*c62be147SJiří Techet 				/* Assembly */
102*c62be147SJiří Techet 				if (getWord("assembly", &cp))
103*c62be147SJiří Techet 				{
104*c62be147SJiří Techet 					createTag(K_ASSEMBLY, cp);
105*c62be147SJiří Techet 					continue;
106*c62be147SJiří Techet 				}
107*c62be147SJiří Techet 				/* Steps */
108*c62be147SJiří Techet 				if (getWord("step", &cp))
109*c62be147SJiří Techet 				{
110*c62be147SJiří Techet 					createTag(K_STEP, cp);
111*c62be147SJiří Techet 					continue;
112*c62be147SJiří Techet 				}
113*c62be147SJiří Techet 			}
114*c62be147SJiří Techet 		}
115*c62be147SJiří Techet 	}
116*c62be147SJiří Techet }
117*c62be147SJiří Techet 
118*c62be147SJiří Techet 
AbaqusParser(void)119*c62be147SJiří Techet extern parserDefinition* AbaqusParser (void)
120*c62be147SJiří Techet {
121*c62be147SJiří Techet 	static const char *const extensions [] = { "inp", NULL };
122*c62be147SJiří Techet 	parserDefinition * def = parserNew ("Abaqus");
123*c62be147SJiří Techet 	def->kindTable  = AbaqusKinds;
124*c62be147SJiří Techet 	def->kindCount  = ARRAY_SIZE (AbaqusKinds);
125*c62be147SJiří Techet 	def->extensions = extensions;
126*c62be147SJiří Techet 	def->parser     = findAbaqusTags;
127*c62be147SJiří Techet 	return def;
128*c62be147SJiří Techet }
129