loadg.c File Reference

#include <stdio.h>
#include <math.h>
#include <dirent.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include "defs.h"
#include "machine.h"
#include "MALLOC.h"
#include "hashtable_metanet.h"

Include dependency graph for loadg.c:

Go to the source code of this file.

Defines

#define MAXNAM   80

Typedefs

typedef int(*) PF (const void *, const void *)

Functions

char * my_basename ()
int CheckGraphName ()
void cerro __PARAMS ((char *str))
char * dirname ()
char * StripGraph ()
static int CompString (char **s1, char **s2)
void C2F() loadg (char *path, int *lpath, char **name, int *lname, int *directed, int *n, int **tail, int **head, char ***node_name, int **node_type, int **node_x, int **node_y, int **node_color, int **node_diam, int **node_border, int **node_font_size, double **node_demand, char ***edge_name, int **edge_color, int **edge_width, int **edge_hi_width, int **edge_font_size, double **edge_length, double **edge_cost, double **edge_min_cap, double **edge_max_cap, double **edge_q_weight, double **edge_q_orig, double **edge_weight, int *default_node_diam, int *default_node_border, int *default_edge_width, int *default_edge_hi_width, int *default_font_size, int *ndim, int *ma)

Variables

static char description [2 *MAXNAM]


Define Documentation

#define MAXNAM   80

Definition at line 30 of file loadg.c.


Typedef Documentation

typedef int(*) PF(const void *, const void *)

Definition at line 38 of file loadg.c.


Function Documentation

void cerro __PARAMS ( (char *str  ) 

int CheckGraphName (  ) 

static int CompString ( char **  s1,
char **  s2 
) [static]

Definition at line 40 of file loadg.c.

Referenced by loadg(), and saveg().

00041 {
00042   return strcmp((char*)*s1,(char*)*s2);
00043 }

Here is the caller graph for this function:

char* dirname (  ) 

void C2F() loadg ( char *  path,
int lpath,
char **  name,
int lname,
int directed,
int n,
int**  tail,
int**  head,
char ***  node_name,
int **  node_type,
int**  node_x,
int**  node_y,
int**  node_color,
int**  node_diam,
int**  node_border,
int **  node_font_size,
double **  node_demand,
char ***  edge_name,
int **  edge_color,
int**  edge_width,
int**  edge_hi_width,
int**  edge_font_size,
double **  edge_length,
double**  edge_cost,
double**  edge_min_cap,
double**  edge_max_cap,
double **  edge_q_weight,
double**  edge_q_orig,
double**  edge_weight,
int default_node_diam,
int default_node_border,
int default_edge_width,
int default_edge_hi_width,
int default_font_size,
int ndim,
int ma 
)

Definition at line 47 of file loadg.c.

References ARCH, ARCW, cerro(), CheckGraphName(), CompString(), ENTRY::data, dir, DIR, dirname, DRAWFONTSIZE, fname, FREE, i, int, ENTRY::key, lar, line, MALLOC, MAXNAM, my_basename(), myhcreate(), myhdestroy(), myhsearch(), NODEDIAM, NODEW, NULL, s, SCIENTER, SCIFIND, and StripGraph().

00069 {
00070   FILE *fg;
00071 #ifndef _MSC_VER
00072   DIR *dirp=NULL;
00073 #endif
00074   char fname[2 * MAXNAM];
00075   char line[5 * MAXNAM];
00076   char strname[MAXNAM], head_name[MAXNAM], tail_name[MAXNAM];
00077   int isize,dsize;
00078   int i,s;
00079   ENTRY node;
00080   ENTRY *found=NULL;
00081   char dir[1024];
00082   char *pname=NULL;
00083   char **lar=NULL;
00084 
00085   path[*lpath] = '\0';
00086 #ifndef _MSC_VER
00087   if ((dirp=opendir(path)) != NULL) 
00088   {
00089     sprintf(description,"\"%s\" is a directory",path);
00090     cerro(description);
00091     closedir(dirp);
00092     return;
00093   }
00094 #endif
00095   if (dirname(path) == NULL) getwd(dir);
00096   else strcpy(dir,dirname(path));
00097 #ifndef _MSC_VER
00098   if ((dirp=opendir(dir)) == NULL) 
00099   {
00100     sprintf(description,"Directory \"%s\" does not exist",dir);
00101     cerro(description);
00102     return;
00103   }
00104   closedir(dirp);
00105 #endif
00106 
00107   pname = StripGraph(my_basename(path));
00108 
00109   *lname = (int)strlen(pname);
00110 
00111   if ((*name = (char *)MALLOC((unsigned)sizeof(char)*(*lname + 1))) == NULL) 
00112   {
00113     cerro("Running out of memory");
00114     return;
00115   }
00116   strcpy(*name,pname);
00117 
00118   if (pname) { FREE(pname); pname=NULL;}
00119 
00120 #ifndef _MSC_VER
00121   if(!CheckGraphName(*name,dir)) 
00122   {
00123     sprintf(description,"Graph file \"%s/%s.graph\" does not exist",dir,*name);
00124     cerro(description);
00125     return;
00126   }
00127 #endif  
00128   isize = sizeof(int);
00129   dsize = sizeof(double);
00130 
00131   strcpy(fname,dir);
00132   strcat(fname,"/");
00133   strcat(fname,*name);
00134   strcat(fname,".graph");
00135   fg = fopen(fname,"r");
00136   if (fg == 0) 
00137   {
00138     sprintf(description,"Unable to open file \"%s/%s.graph\"",dir,*name);
00139     cerro(description);
00140     return;
00141   }
00142   /* read graph from graph file */
00143   
00144   fgets(line,5 * MAXNAM,fg);
00145   fgets(line,5 * MAXNAM,fg);
00146   *default_node_diam = NODEDIAM;
00147   *default_node_border = NODEW;
00148   *default_edge_width = ARCW;
00149   *default_edge_hi_width = ARCH;
00150   *default_font_size = DRAWFONTSIZE;
00151   sscanf(line,"%d %d %d %d %d %d",directed,default_node_diam,
00152          default_node_border,default_edge_width,
00153          default_edge_hi_width,default_font_size);
00154   if (*default_node_diam == 0) *default_node_diam = NODEDIAM;
00155   if (*default_node_border == 0) *default_node_border = NODEW;
00156   if (*default_edge_width == 0) *default_edge_width = ARCW;
00157   if (*default_edge_hi_width == 0) *default_edge_hi_width = ARCH;
00158   if (*default_font_size == 0) *default_font_size = DRAWFONTSIZE;
00159   fgets(line,5 * MAXNAM,fg);
00160   fgets(line,5 * MAXNAM,fg);
00161   sscanf(line,"%d",ma);
00162   fgets(line,5 * MAXNAM,fg);
00163   fgets(line,5 * MAXNAM,fg);
00164   sscanf(line,"%d",ndim);
00165   *n = *ndim;
00166   fgets(line,5 * MAXNAM,fg);
00167   fgets(line,5 * MAXNAM,fg);
00168   fgets(line,5 * MAXNAM,fg);
00169   fgets(line,5 * MAXNAM,fg);
00170   fgets(line,5 * MAXNAM,fg);
00171   
00172   /* alloc memory for nodes */
00173   s = sizeof(char *) * *ndim;
00174   if ((*node_name = (char **)MALLOC(s)) == NULL) 
00175   {
00176     cerro("Running out of memory");
00177     return;
00178   }
00179   s = isize * *ndim;
00180   if ((*node_type = (int *)MALLOC(s)) == NULL) 
00181   {
00182     cerro("Running out of memory");
00183     return;
00184   }
00185   if ((*node_x = (int *)MALLOC(s)) == NULL) 
00186   {
00187     cerro("Running out of memory");
00188     return;
00189   }
00190   if ((*node_y = (int *)MALLOC(s)) == NULL) 
00191   {
00192     cerro("Running out of memory");
00193     return;
00194   }
00195   if ((*node_color = (int *)MALLOC(s)) == NULL) 
00196   {
00197     cerro("Running out of memory");
00198     return;
00199   }
00200   if ((*node_diam = (int *)MALLOC(s)) == NULL) 
00201   {
00202     cerro("Running out of memory");
00203     return;
00204   }
00205   if ((*node_border = (int *)MALLOC(s)) == NULL) 
00206   {
00207     cerro("Running out of memory");
00208     return;
00209   }
00210   if ((*node_font_size = (int *)MALLOC(s)) == NULL) 
00211   {
00212     cerro("Running out of memory");
00213     return;
00214   }
00215   s = dsize * *ndim;
00216   if ((*node_demand = (double *)MALLOC(s)) == NULL) 
00217   {
00218     cerro("Running out of memory");
00219     return;
00220   }
00221 
00222   /* alloc memory for edges */
00223   s = sizeof(char *) * *ma;
00224   if ((*edge_name = (char **)MALLOC(s)) == NULL) 
00225   {
00226     cerro("Running out of memory");
00227     return;
00228   }
00229   s = isize * *ma;
00230   if ((*head = (int *)MALLOC(s)) == NULL) 
00231   {
00232     cerro("Running out of memory");
00233     return;
00234   }
00235   if ((*tail = (int *)MALLOC(s)) == NULL) 
00236   {
00237     cerro("Running out of memory");
00238     return;
00239   } 
00240   if ((*edge_color = (int *)MALLOC(s)) == NULL) 
00241   {
00242     cerro("Running out of memory");
00243     return;
00244   }
00245   if ((*edge_width = (int *)MALLOC(s)) == NULL) 
00246   {
00247     cerro("Running out of memory");
00248     return;
00249   }
00250   if ((*edge_hi_width = (int *)MALLOC(s)) == NULL) 
00251   {
00252     cerro("Running out of memory");
00253     return;
00254   }
00255   if ((*edge_font_size = (int *)MALLOC(s)) == NULL) 
00256   {
00257     cerro("Running out of memory");
00258     return;
00259   }
00260   s = dsize * *ma;
00261   if ((*edge_length = (double *)MALLOC(s)) == NULL) 
00262   {
00263     cerro("Running out of memory");
00264     return;
00265   }
00266   if ((*edge_cost = (double *)MALLOC(s)) == NULL) 
00267   {
00268     cerro("Running out of memory");
00269     return;
00270   }
00271   if ((*edge_min_cap = (double *)MALLOC(s)) == NULL) 
00272   {
00273     cerro("Running out of memory");
00274     return;
00275   }
00276   if ((*edge_max_cap = (double *)MALLOC(s)) == NULL) 
00277   {
00278     cerro("Running out of memory");
00279     return;
00280   }
00281   if ((*edge_q_weight = (double *)MALLOC(s)) == NULL) 
00282   {
00283     cerro("Running out of memory");
00284     return;
00285   }
00286   if ((*edge_q_orig = (double *)MALLOC(s)) == NULL) 
00287   {
00288     cerro("Running out of memory");
00289     return;
00290   }
00291   if ((*edge_weight = (double *)MALLOC(s)) == NULL) 
00292   {
00293     cerro("Running out of memory");
00294     return;
00295   }
00296 
00297   /* jump to node description */
00298   for (i = 0; i < 2 * *ma; i++) fgets(line,5 * MAXNAM,fg);
00299 
00300   fgets(line,5 * MAXNAM,fg);
00301   fgets(line,5 * MAXNAM,fg);
00302   fgets(line,5 * MAXNAM,fg);
00303   fgets(line,5 * MAXNAM,fg);
00304   fgets(line,5 * MAXNAM,fg);
00305   fgets(line,5 * MAXNAM,fg);
00306 
00307   myhcreate(*ndim);
00308   for (i = 0; i < *ndim; i++) 
00309   {
00310     fgets(line,5 * MAXNAM,fg);
00311     (*node_type)[i] = 0;
00312     sscanf(line,"%s %d",strname,&((*node_type)[i]));
00313     if (((*node_name)[i] = (char *)MALLOC(strlen(strname)+1)) == NULL) 
00314         {
00315       cerro("Running out of memory");
00316       return;
00317     }
00318     strcpy((*node_name)[i],strname);
00319     fgets(line,5 * MAXNAM,fg);
00320     (*node_x)[i] = 0;
00321     (*node_y)[i] = 0;
00322     (*node_color)[i] = 0;
00323     (*node_diam)[i] = 0;
00324     (*node_border)[i] = 0;
00325     (*node_font_size)[i] = 0;
00326     sscanf(line,"%d %d %d %d %d %d",
00327            &((*node_x)[i]),&((*node_y)[i]),&((*node_color)[i]),
00328            &((*node_diam)[i]),&((*node_border)[i]),&((*node_font_size)[i]));
00329     fgets(line,5 * MAXNAM,fg);
00330     sscanf(line,"%le",&((*node_demand)[i]));
00331 
00332     if ((node.key = (char *)MALLOC(strlen(strname)+1)) == NULL) 
00333         {
00334       cerro("Running out of memory");
00335       return;
00336     }
00337 
00338     strcpy(node.key,strname);
00339     sprintf(strname,"%d",i+1);
00340 
00341     if ((node.data = (char *)MALLOC(strlen(strname)+1)) == NULL) 
00342         {
00343       cerro("Running out of memory");
00344       return;
00345     }   
00346     strcpy(node.data,strname);
00347         myhsearch(node,SCIENTER);
00348 
00349         if (node.data) {FREE(node.data);node.data=NULL;}
00350         if (node.key) {FREE(node.key);node.key=NULL;}
00351   }
00352 
00353   /* check uniqueness of node names */
00354   if (*ndim != 1) 
00355   {
00356     if ((lar = (char **)MALLOC(sizeof(char *) * *ndim)) == NULL) 
00357         {
00358       cerro("Running out of memory");
00359       return;
00360     }
00361 
00362     for (i = 0; i < *ndim; i++) lar[i] = (*node_name)[i];
00363 
00364     qsort((char*)lar,*ndim,sizeof(char*),(PF)CompString);
00365 
00366     for (i = 0; i < *ndim - 1; i++) 
00367         {
00368       if (!strcmp(lar[i],lar[i+1])) 
00369           {
00370                 sprintf(description,"Bad graph file. Node \"%s\" is duplicated",lar[i]);
00371                 cerro(description);
00372                 FREE(lar);
00373                 lar=NULL;
00374                 return;
00375       }
00376     }
00377 
00378     if (!strcmp(lar[*ndim - 2],lar[*ndim - 1])) 
00379         {
00380       sprintf(description,"Bad graph file. Node \"%s\" is duplicated",lar[*ndim - 2]);
00381       cerro(description);
00382           if (lar) {FREE(lar);lar=NULL;}
00383       return;
00384     }
00385     if (lar) {FREE(lar);lar=NULL;}
00386   }
00387  
00388    /* rewind and go to arc description */
00389   rewind(fg);
00390   for (i = 0; i < 11; i++) fgets(line,5 * MAXNAM,fg);
00391 
00392   for (i = 0; i < *ma; i++) 
00393   {
00394         fgets(line,5 * MAXNAM,fg);
00395         (*edge_color)[i] = 0;
00396         (*edge_width)[i] = 0;
00397         (*edge_hi_width)[i] = 0;
00398         (*edge_font_size)[i] = 0;
00399         sscanf(line,"%s %s %s %d %d %d %d\n",strname,
00400                 tail_name,head_name,
00401                 &((*edge_color)[i]),&((*edge_width)[i]),&((*edge_hi_width)[i]),
00402                 &((*edge_font_size)[i]));
00403 
00404         if (((*edge_name)[i] = (char *)MALLOC(strlen(strname)+1)) == NULL) 
00405         {
00406                 cerro("Running out of memory");
00407                 return;
00408     }
00409         strcpy((*edge_name)[i],strname);
00410 
00411         if ((node.key = (char *)MALLOC(strlen(head_name)+1)) == NULL) 
00412         {
00413                 cerro("Running out of memory");
00414                 return;
00415         }
00416 
00417         strcpy(node.key,head_name);
00418         found = myhsearch(node,SCIFIND);
00419         if (found == NULL) 
00420         {
00421                 sprintf(description,"Bad graph file. Node \"%s\" referenced by arc \"%s\" not found",head_name,(*edge_name)[i]);
00422                 cerro(description);
00423                 return;
00424         }
00425         (*head)[i] = atoi(found->data);
00426 
00427         if(found)
00428         {
00429                 if (found->data) {FREE(found->data);found->data=NULL;}
00430                 if (found->key) {FREE(found->key);found->key=NULL;}
00431                 FREE(found);found=NULL;
00432         }
00433         
00434 
00435         if ((node.key = (char *)MALLOC(strlen(tail_name)+1)) == NULL) 
00436         {
00437                 cerro("Running out of memory");
00438                 return;
00439         }
00440 
00441         strcpy(node.key,tail_name);
00442         found = myhsearch(node,SCIFIND);
00443         if (found == NULL) 
00444         {
00445                 sprintf(description,
00446             "Bad graph file. Node \"%s\" referenced by arc \"%s\" not found",
00447             tail_name,(*edge_name)[i]);
00448                 cerro(description);
00449                 return;
00450         }
00451         (*tail)[i] = atoi(found->data);
00452         if(found)
00453         {
00454                 if (found->data) {FREE(found->data);found->data=NULL;}
00455                 if (found->key) {FREE(found->key);found->key=NULL;}
00456                 FREE(found);found=NULL;
00457         }
00458  
00459         fgets(line,5 * MAXNAM,fg);
00460         sscanf(line,"%le %le %le %le %le %le %le",
00461                 &((*edge_cost)[i]),&((*edge_min_cap)[i]),
00462                 &((*edge_max_cap)[i]),&((*edge_length)[i]),
00463                 &((*edge_q_weight)[i]),&((*edge_q_orig)[i]),
00464                 &((*edge_weight)[i]));
00465         }
00466   
00467         myhdestroy();
00468         fclose(fg);
00469         if (node.key) {FREE(node.key);node.key=NULL;}
00470         if (node.data) {FREE(node.data);node.data=NULL;}
00471 }

Here is the call graph for this function:

char* my_basename (  ) 

char* StripGraph (  ) 


Variable Documentation

char description[2 *MAXNAM] [static]

Definition at line 45 of file loadg.c.

Referenced by saveg(), ScilabMStr2C(), and xgetfile().


Generated on Sun Mar 4 16:10:25 2007 for Scilab [trunk] by  doxygen 1.5.1