~ubuntu-branches/ubuntu/karmic/scilab/karmic

« back to all changes in this revision

Viewing changes to routines/metanet/saveg.c

  • Committer: Bazaar Package Importer
  • Author(s): Torsten Werner
  • Date: 2002-03-21 16:57:43 UTC
  • Revision ID: james.westby@ubuntu.com-20020321165743-e9mv12c1tb1plztg
Tags: upstream-2.6
ImportĀ upstreamĀ versionĀ 2.6

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <stdio.h>
 
2
#if !(defined __MSC__) && !(defined __ABSC__)
 
3
#if defined(netbsd) || defined(freebsd) 
 
4
#include <sys/types.h>
 
5
#endif
 
6
#include <dirent.h>
 
7
#endif
 
8
#include <string.h>
 
9
#ifdef __STDC__
 
10
#include <stdlib.h>
 
11
#else
 
12
#include <malloc.h>
 
13
#endif
 
14
 
 
15
#if (defined __MSC__) || (defined __ABSC__) 
 
16
/** only used for x=dir[1024] **/
 
17
#ifndef __ABSC__
 
18
#define  getwd(x) _getcwd(x,1024) 
 
19
#define chdir(x) _chdir(x)
 
20
#else
 
21
#define  getwd(x) getcwd_(x,1024) 
 
22
#endif
 
23
#endif
 
24
 
 
25
#if defined(netbsd) || defined(freebsd)
 
26
#include <unistd.h>
 
27
#endif
 
28
 
 
29
#include "../machine.h"
 
30
 
 
31
#define MAXNAM 80
 
32
 
 
33
extern double atof();
 
34
extern char* my_basename();
 
35
extern void cerro();
 
36
extern char* dirname();
 
37
extern int CheckGraphName();
 
38
extern char *StripGraph();
 
39
 
 
40
typedef int (*PF)();
 
41
 
 
42
static int CompString(s1, s2)
 
43
char **s1, **s2;
 
44
{
 
45
  return strcmp((char*)*s1,(char*)*s2);
 
46
}
 
47
 
 
48
void C2F(saveg)(path,lpath,name,lname,directed,node_number,tail,head,
 
49
  node_name,node_type,node_x,node_y,node_color,node_diam,node_border,
 
50
  node_font_size,node_demand,
 
51
  edge_name,edge_color,edge_width,edge_hi_width,edge_font_size,
 
52
  edge_length,edge_cost,edge_min_cap,edge_max_cap,edge_q_weight,edge_q_orig,
 
53
  edge_weight,
 
54
  default_node_diam,default_node_border,default_edge_width,
 
55
  default_edge_hi_width,default_font_size,ma)
 
56
char *path; int *lpath;
 
57
char *name; int *lname,*directed,*node_number,*tail,*head;
 
58
char ***node_name; 
 
59
int *node_type,*node_x,*node_y,*node_color,*node_diam,*node_border;
 
60
int *node_font_size;
 
61
double *node_demand;
 
62
char ***edge_name;
 
63
int *edge_color,*edge_width,*edge_hi_width,*edge_font_size;
 
64
double *edge_length,*edge_cost,*edge_min_cap,*edge_max_cap;
 
65
double *edge_q_weight,*edge_q_orig,*edge_weight;
 
66
int *default_node_diam,*default_node_border,*default_edge_width;
 
67
int *default_edge_hi_width,*default_font_size;
 
68
int *ma;
 
69
{
 
70
  FILE *f;
 
71
#if !(defined __MSC__) && !(defined __ABSC__)
 
72
  DIR *dirp;
 
73
#else
 
74
  int it;
 
75
#endif
 
76
  char fname[2*MAXNAM];
 
77
  char description[2*MAXNAM];
 
78
  char dir[1024], nname[2*MAXNAM];
 
79
  int i;
 
80
  char **lar;
 
81
 
 
82
  /* check uniqueness of node names */
 
83
  if (*node_number != 1) {
 
84
    if ((lar = (char **)malloc(sizeof(char *) * *node_number)) == NULL) {
 
85
      cerro("Running out of memory");
 
86
      return;
 
87
    }
 
88
    for (i = 0; i < *node_number; i++) lar[i] = (*node_name)[i];
 
89
    qsort((char*)lar,*node_number,sizeof(char*),(PF)CompString);
 
90
    for (i = 0; i < *node_number - 1; i++) {
 
91
      if (!strcmp(lar[i],lar[i+1])) {
 
92
        sprintf(description,
 
93
                "Bad graph file. Node \"%s\" is duplicated",lar[i]);
 
94
        cerro(description);
 
95
        free(lar);
 
96
        return;
 
97
      }
 
98
    }
 
99
    if (!strcmp(lar[*node_number - 2],lar[*node_number - 1])) {
 
100
      sprintf(description,
 
101
              "Bad graph file. Node \"%s\" is duplicated",lar[*node_number - 2]);
 
102
      cerro(description);
 
103
      free(lar);
 
104
      return;
 
105
    }
 
106
    free(lar);
 
107
  }
 
108
 
 
109
  path[*lpath] = '\0';
 
110
  name[*lname] = '\0';
 
111
  
 
112
  if (!strcmp(path," ")) {
 
113
    getwd(dir);
 
114
    strcpy(nname,name);
 
115
  }
 
116
  else {
 
117
#if (defined __MSC__) || (defined __ABSC__)
 
118
    getwd(dir);
 
119
#ifdef __MSC__  
 
120
    it= chdir(path);
 
121
    chdir(dir);
 
122
#else
 
123
    it= chdir_(path,strlen(path));
 
124
    chdir_(dir,strlen(dir));
 
125
#endif
 
126
    if (it == 0) {
 
127
      strcpy(dir,path);
 
128
    }
 
129
#else
 
130
    if ((dirp=opendir(path)) != NULL) {
 
131
      strcpy(dir,path);
 
132
      closedir(dirp);
 
133
    }
 
134
#endif 
 
135
    else {
 
136
      strcpy(nname,StripGraph(my_basename(path)));
 
137
      if (dirname(path) == NULL) getwd(dir);
 
138
      else strcpy(dir,dirname(path));     
 
139
    }
 
140
  }
 
141
#if !(defined __MSC__) && !(defined __ABSC__)
 
142
  if ((dirp=opendir(dir)) == NULL) {
 
143
    sprintf(description,"Directory \"%s\" does not exist",dir);
 
144
    cerro(description);
 
145
    return;
 
146
  }
 
147
  closedir(dirp);
 
148
 
 
149
  if(CheckGraphName(nname,dir)) {
 
150
    sprintf(description,"Graph \"%s\" already exists in directory \"%s\"",
 
151
            nname,dir);
 
152
    cerro(description);
 
153
    return;
 
154
  }
 
155
#endif
 
156
 
 
157
  strcpy(fname,dir);
 
158
  strcat(fname,"/");
 
159
  strcat(fname,nname);
 
160
  strcat(fname,".graph");
 
161
  f = fopen(fname,"w");
 
162
  if (f == NULL) {
 
163
    sprintf(description,
 
164
            "Unable to write file in directory %s, check access",dir);
 
165
    cerro(description);
 
166
    return;
 
167
  }
 
168
  /* Write graph to file */
 
169
  
 
170
  fprintf(f,"GRAPH TYPE (0 = UNDIRECTED, 1 = DIRECTED), DEFAULTS (NODE DIAMETER, NODE BORDER, ARC WIDTH, HILITED ARC WIDTH, FONTSIZE):\n");
 
171
  fprintf(f,"%d %d %d %d %d %d\n",*directed,*default_node_diam,
 
172
          *default_node_border,*default_edge_width,*default_edge_hi_width,
 
173
          *default_font_size);
 
174
  if (*directed) {
 
175
    fprintf(f,"NUMBER OF ARCS:\n");
 
176
  }
 
177
  else {
 
178
    fprintf(f,"NUMBER OF EDGES:\n");
 
179
  }
 
180
  fprintf(f,"%d\n",*ma);
 
181
  fprintf(f,"NUMBER OF NODES:\n");
 
182
  fprintf(f,"%d\n",*node_number);
 
183
  fprintf(f,"****************************************\n");
 
184
 
 
185
  /* Write arcs to files */
 
186
 
 
187
  if (*directed) {
 
188
    fprintf(f,"DESCRIPTION OF ARCS:\n");
 
189
    fprintf(f,"ARC NAME, TAIL NODE NAME, HEAD NODE NAME, COLOR, WIDTH, HIWIDTH, FONTSIZE\n");
 
190
  }
 
191
  else {
 
192
    fprintf(f,"DESCRIPTION OF EDGES:\n");
 
193
    fprintf(f,"EDGE NAME, NODE NAME, NODE NAME, COLOR, WIDTH, HIWIDTH, FONTSIZE\n");
 
194
  }
 
195
  fprintf
 
196
    (f,"COST, MIN CAP, MAX CAP, LENGTH, Q WEIGHT, Q ORIGIN, WEIGHT\n");
 
197
  fprintf(f,"\n");
 
198
 
 
199
  for (i = 0; i < *ma; i++) {
 
200
    fprintf(f,"%s %s %s %d %d %d %d\n",(*edge_name)[i],(*node_name)[tail[i]-1],
 
201
            (*node_name)[head[i]-1],edge_color[i],edge_width[i],
 
202
            edge_hi_width[i],edge_font_size[i]);
 
203
    fprintf(f,"%e %e %e %e %e %e %e\n",
 
204
            edge_cost[i],edge_min_cap[i],edge_max_cap[i],edge_length[i],
 
205
            edge_q_weight[i],edge_q_orig[i],edge_weight[i]);
 
206
  }
 
207
  
 
208
  /* Write nodes to files */
 
209
 
 
210
  fprintf(f,"****************************************\n");
 
211
  fprintf(f,"DESCRIPTION OF NODES:\n");
 
212
  fprintf(f,"NODE NAME, POSSIBLE TYPE (1 = SINK, 2 = SOURCE)\n");
 
213
  fprintf(f,"X, Y, COLOR, DIAMETER, BORDER, FONTSIZE\n");
 
214
  fprintf(f,"DEMAND\n");
 
215
  fprintf(f,"\n");
 
216
 
 
217
  for (i = 0; i < *node_number; i++) {
 
218
    if (node_type[i] == 0)
 
219
      fprintf(f,"%s\n",(*node_name)[i]);
 
220
    else fprintf(f,"%s %d\n",(*node_name)[i],node_type[i]);
 
221
    fprintf(f,"%d %d %d %d %d %d \n",
 
222
            node_x[i],node_y[i],node_color[i],node_diam[i],
 
223
            node_border[i],node_font_size[i]);
 
224
    fprintf(f,"%e\n",node_demand[i]);
 
225
  }
 
226
 
 
227
  fclose(f);
 
228
}