source: rtems/doc/tools/src2html1.4a/Ctags/fortran.c @ bf09257a

4.104.114.84.95
Last change on this file since bf09257a was 52461c5, checked in by Joel Sherrill <joel.sherrill@…>, on 04/14/98 at 16:03:45

New files

  • Property mode set to 100644
File size: 3.9 KB
Line 
1/*
2 * Copyright (c) 1987 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 *    must display the following acknowledgement:
15 *      This product includes software developed by the University of
16 *      California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 *    may be used to endorse or promote products derived from this software
19 *    without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34#ifndef lint
35static char sccsid[] = "@(#)fortran.c   5.5 (Berkeley) 2/26/91";
36#endif /* not lint */
37
38#include <stdio.h>
39#include <string.h>
40#include "ctags.h"
41
42static void takeprec();
43
44char *lbp;                              /* line buffer pointer */
45
46PF_funcs()
47{
48        register bool   pfcnt;          /* pascal/fortran functions found */
49        register char   *cp;
50        char    tok[MAXTOKEN],
51                *gettoken();
52
53        for (pfcnt = NO;;) {
54                lineftell = ftell(inf);
55                if (!fgets(lbuf,sizeof(lbuf),inf))
56                        return(pfcnt);
57                ++lineno;
58                lbp = lbuf;
59                if (*lbp == '%')        /* Ratfor escape to fortran */
60                        ++lbp;
61                for (;isspace(*lbp);++lbp);
62                if (!*lbp)
63                        continue;
64                switch (*lbp | ' ') {   /* convert to lower-case */
65                case 'c':
66                        if (cicmp("complex") || cicmp("character"))
67                                takeprec();
68                        break;
69                case 'd':
70                        if (cicmp("double")) {
71                                for (;isspace(*lbp);++lbp);
72                                if (!*lbp)
73                                        continue;
74                                if (cicmp("precision"))
75                                        break;
76                                continue;
77                        }
78                        break;
79                case 'i':
80                        if (cicmp("integer"))
81                                takeprec();
82                        break;
83                case 'l':
84                        if (cicmp("logical"))
85                                takeprec();
86                        break;
87                case 'r':
88                        if (cicmp("real"))
89                                takeprec();
90                        break;
91                }
92                for (;isspace(*lbp);++lbp);
93                if (!*lbp)
94                        continue;
95                switch (*lbp | ' ') {
96                case 'f':
97                        if (cicmp("function"))
98                                break;
99                        continue;
100                case 'p':
101                        if (cicmp("program") || cicmp("procedure"))
102                                break;
103                        continue;
104                case 's':
105                        if (cicmp("subroutine"))
106                                break;
107                default:
108                        continue;
109                }
110                for (;isspace(*lbp);++lbp);
111                if (!*lbp)
112                        continue;
113                for (cp = lbp + 1;*cp && intoken(*cp);++cp);
114                if (cp = lbp + 1)
115                        continue;
116                *cp = EOS;
117                (void)strcpy(tok,lbp);
118                getline();                      /* process line for ex(1) */
119                pfnote(tok,lineno);
120                pfcnt = YES;
121        }
122        /*NOTREACHED*/
123}
124
125/*
126 * cicmp --
127 *      do case-independent strcmp
128 */
129cicmp(cp)
130        register char   *cp;
131{
132        register int    len;
133        register char   *bp;
134
135        for (len = 0,bp = lbp;*cp && (*cp &~ ' ') == (*bp++ &~ ' ');
136            ++cp,++len);
137        if (!*cp) {
138                lbp += len;
139                return(YES);
140        }
141        return(NO);
142}
143
144static void
145takeprec()
146{
147        for (;isspace(*lbp);++lbp);
148        if (*lbp == '*') {
149                for (++lbp;isspace(*lbp);++lbp);
150                if (!isdigit(*lbp))
151                        --lbp;                  /* force failure */
152                else
153                        while (isdigit(*++lbp));
154        }
155}
Note: See TracBrowser for help on using the repository browser.