~ubuntu-branches/ubuntu/vivid/atlas/vivid

« back to all changes in this revision

Viewing changes to CONFIG/winf77.c

  • Committer: Bazaar Package Importer
  • Author(s): Sylvestre Ledru
  • Date: 2009-09-17 23:31:54 UTC
  • mto: (2.2.1 experimental)
  • mto: This revision was merged to the branch mainline in revision 10.
  • Revision ID: james.westby@ubuntu.com-20090917233154-9esw88ub02twbuab
Tags: upstream-3.8.3
ImportĀ upstreamĀ versionĀ 3.8.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
 
2
 
#include <stdio.h>
3
 
#include <stdlib.h>
4
 
#include <string.h>
5
 
#include <assert.h>
6
 
 
7
 
int slashdrivesub(char *ln)
8
 
/*
9
 
 * replaces \\c\ with c:\, returns change in string length
10
 
 * this version required for older cygwins
11
 
 */
12
 
{
13
 
   char *sp, *lp=ln, ctmp;
14
 
   int nrep=0;
15
 
   do
16
 
   {
17
 
      sp = strstr(lp, "\\\\");
18
 
      if (sp && strlen(sp) > 3)
19
 
      {
20
 
         if (sp[2] == 'a' || sp[2] == 'b' || sp[2] == 'c' || sp[2] == 'd' ||
21
 
             sp[2] == 'e' || sp[2] == 'f' || sp[2] == 'g' || sp[2] == 'h')
22
 
         {
23
 
            if (sp[3] == '\\')
24
 
            {
25
 
               ctmp = sp[2];
26
 
               sp[0] = sp[2];
27
 
               sp[1] = ':';
28
 
               sp[2] = '\\';
29
 
               for (lp=sp+3; *lp = lp[1]; lp++);
30
 
               lp = sp + 3;
31
 
               nrep++;
32
 
            }
33
 
            else lp = sp + 2;
34
 
         }
35
 
         else lp = sp + 2;
36
 
      }
37
 
      else lp = sp + 2;
38
 
   }
39
 
   while (sp);
40
 
   return(-nrep);
41
 
}
42
 
 
43
 
int cygdrivesub(char *ln)
44
 
/*
45
 
 * replaces \cygdrive\c\ with c:\, returns change in string length
46
 
 * this version works cygnus version 1.1.0
47
 
 */
48
 
{
49
 
   char *sp;
50
 
   int i=0;
51
 
 
52
 
   while(sp = strstr(ln, "\\cygdrive\\"))
53
 
   {
54
 
      i++;
55
 
      sp[0] = sp[10];
56
 
      sp[1] = ':';
57
 
      sp[2] = '\\';
58
 
      sp += 3;
59
 
      while (*sp = sp[9]) sp++;
60
 
   }
61
 
   return( slashdrivesub(ln) - (i*9) );
62
 
}
63
 
 
64
 
void slashsub(char *ln)
65
 
/*
66
 
 * changes forward slash of unix to backslash of windoze
67
 
 */
68
 
{
69
 
   int i;
70
 
   for (i=0; ln[i]; i++) if (ln[i] == '/') ln[i] = '\\';
71
 
}
72
 
 
73
 
void doto2dotobj(char *ln)
74
 
/*
75
 
 * changes all occurences of unix's .o extension to windoze-friendly obj
76
 
 */
77
 
{
78
 
   char ln2[4096];
79
 
   int i, j=0;
80
 
   for (i=0; ln[i]; i++)
81
 
   {
82
 
      ln2[j++] = ln[i];
83
 
      if (ln[i] == '.' && ln[i+1] == 'o' && isspace(ln[i+2]))
84
 
      {
85
 
         ln2[j] = 'o';
86
 
         ln2[j+1] = 'b';
87
 
         ln2[j+2] = 'j';
88
 
         ln2[j+3] = ln[i+2];
89
 
         j += 4;
90
 
         i += 2;
91
 
      }
92
 
   }
93
 
   ln2[j] = '\0';
94
 
   sprintf(ln, "%s", ln2);
95
 
}
96
 
 
97
 
#ifdef DEBUG
98
 
 
99
 
#define system SYSTEM
100
 
int system(char *ln)
101
 
{
102
 
   fprintf(stdout, "%s\n", ln);
103
 
   return(0);
104
 
}
105
 
 
106
 
#endif
107
 
 
108
 
typedef struct wOrDs WORDS;
109
 
struct wOrDs
110
 
{
111
 
   char *word;
112
 
   WORDS *next;
113
 
};
114
 
 
115
 
void KillWords(WORDS *wp)
116
 
{
117
 
   WORDS *wpn;
118
 
 
119
 
   while (wp)
120
 
   {
121
 
      free(wp->word);
122
 
      wpn = wp->next;
123
 
      free(wp);
124
 
      wp = wpn;
125
 
   }
126
 
}
127
 
 
128
 
WORDS *AddWord(WORDS *wbas, char *wrd, int wlen)
129
 
{
130
 
   WORDS *wp;
131
 
   int i;
132
 
 
133
 
   wp = malloc(sizeof(WORDS));
134
 
   assert(wp);
135
 
   wp->word = malloc( (wlen+1) * sizeof(char) );
136
 
   for (i=0; i != wlen; i++) wp->word[i] = wrd[i];
137
 
   wp->word[i] = '\0';
138
 
   wp->next = wbas;
139
 
   return(wp);
140
 
}
141
 
 
142
 
WORDS *AddFile(WORDS *wbase, char *fnam)
143
 
{
144
 
   int i, len;
145
 
   len = strlen(fnam);
146
 
   assert(len > 2);
147
 
   if (fnam[len-1] = 'f' && fnam[len-2] == '.');
148
 
   {
149
 
      for (i=len-3; i > 0; i--)
150
 
      {
151
 
         if (fnam[i] == ' ' || fnam[i] == '/' || fnam[i] == '\\')
152
 
         {
153
 
            i++;
154
 
            break;
155
 
         }
156
 
      }
157
 
      wbase = AddWord(wbase, fnam+i, len-i-2);
158
 
   }
159
 
   return(wbase);
160
 
}
161
 
 
162
 
int RenameFiles(WORDS *wbase)
163
 
{
164
 
   WORDS *wp;
165
 
   char ln[4096];
166
 
 
167
 
   for (wp=wbase; wp; wp = wp->next)
168
 
   {
169
 
      sprintf(ln, "MOVE %s.obj %s.o\n", wp->word, wp->word);
170
 
      fprintf(stdout, "%s", ln);
171
 
      if (system(ln)) return(1);
172
 
   }
173
 
   return(0);
174
 
}
175
 
 
176
 
main(int nargs, char **args)
177
 
{
178
 
   char ln[4096], *cptr=NULL;
179
 
   int i, j, k, ierr, ic;
180
 
   int COMP=0, RENAME=0;
181
 
   WORDS *wbase=NULL;
182
 
 
183
 
   ic = sprintf(ln, "\"%s\" ", DEFDF);
184
 
   slashsub(ln);
185
 
   ic += sprintf(ln+ic, "/iface:cref ");
186
 
 
187
 
   for (i=1; i < nargs; i++)
188
 
   {
189
 
      if (args[i][0] == '-')  /* compiler flag */
190
 
      {
191
 
         if (args[i][1] == 'o') /* handle renaming, guess exe not .obj */
192
 
         {
193
 
            RENAME = 1;
194
 
            k = strlen(args[++i]);
195
 
            j = sprintf(ln+ic, "/Fe%s.exe ", args[i]);
196
 
            cptr = ln+ic;
197
 
            slashsub(ln+ic+3);
198
 
         }
199
 
         else if (args[i][1] == 'l') /* library to link against */
200
 
         {
201
 
            j = sprintf(ln+ic, "/link:DEFAULTLIB:%s", &args[i][2]);
202
 
            slashsub(ln+ic+17);
203
 
         }
204
 
         else
205
 
         {
206
 
            if (args[i][1] == 'c') COMP=1;
207
 
            j = sprintf(ln+ic, "/%s ", &args[i][1]);
208
 
            slashsub(ln+ic+1);
209
 
         }
210
 
      }
211
 
      else  /* must be files, not flags */
212
 
      {
213
 
         j = sprintf(ln+ic, "%s ", args[i]);
214
 
         if (j > 3 && ln[ic+j-2] == 'f' && ln[ic+j-3] == '.')
215
 
         { /* add this file to list of files to be moved to .o */
216
 
            wbase = AddFile(wbase, args[i]);
217
 
         }
218
 
         slashsub(ln+ic);
219
 
      }
220
 
      ic += j;
221
 
   }
222
 
   sprintf(ln+ic, "\n");
223
 
   cygdrivesub(ln);
224
 
   if (RENAME && COMP) /* gotta use different rename command if not exe */
225
 
   {
226
 
      cptr = strstr(ln, "/Fe");
227
 
      assert(cptr);
228
 
      cptr[2] = 'o';
229
 
      cptr = strstr(cptr, ".exe");
230
 
      assert(cptr);
231
 
      cptr[0] = cptr[1] = cptr[2] = cptr[3] = ' ';
232
 
   }
233
 
   fprintf(stdout, "%s", ln);
234
 
   ierr = system(ln);
235
 
   if (!ierr && COMP && !RENAME) /* rename the .obj to .o */
236
 
      ierr = RenameFiles(wbase);
237
 
   KillWords(wbase);
238
 
   exit(ierr);
239
 
}