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