/* names.c * last revised at 14, October. 1995 * * Copyright (C) 1994, All rights reserved. * written by Gyudong Kim(chilly@iclab.snu.ac.kr) * */ #include "findhier.h" #include #include extern int interactive; extern int mode; extern FORMAT Format; extern struct names *fhpath; struct names *nametop; extern int (*mystrcmp)(); char EXT[5]; void create(dp) char *dp; { struct names *tmp; for(tmp=nametop;tmp!=NULL;tmp=tmp->next) if (!(*mystrcmp)(tmp->name,dp)) return; tmp=(struct names *)myalloc(sizeof(struct names),"create"); tmp->name=(char *) myalloc((SIZE)(strlen(dp)+1)*sizeof(char),"create_string"); (void)strcpy(tmp->name,dp); tmp->next=nametop; nametop=tmp; } #define putadot() \ {\ if (Format==PCSTR\ || Format==MAGIC\ || Format==TeX\ ) (void)fputc('.',stderr);\ } int glob_error(buf,pname) char *buf,*pname; { if (mode!='d') { if (!strcmp(pname,"Main")) { warning("Cell |%s",buf); warning("%s| not found.\n",EXT); if (interactive) return(0); exit(-1); } if (!interactive) { bell(); warning("dangling cell |%s",buf); warning("%s| in ",EXT); warning("%s.\n",pname); } } return(-1); } char *global(buf,pname) char *buf,*pname; { struct names *tmp; switch (Format) { case CIF: return(cif_global(buf,pname)); case TeX: case MAGIC: case PCSTR: case GDSII: case VALID: if (buf[0]==0) { warning("Null name found in %s.\n",pname); return((char *)NULL); } for(tmp=nametop;tmp!=NULL;tmp=tmp->next) { if (!(*mystrcmp)(buf,tmp->name)) return(tmp->name); } if (!glob_error(buf,pname)) return((char *)NULL); create(buf); vacant(nametop->name); return(nametop->name); default: break; } return((char *)NULL); } char *extension(dp) char *dp; { int i; for(i = strlen(dp)-1;i>=0;i--) { if (dp[i]=='.') break; } dp[i]=0; return((char *)(dp+i+1)); } static void add_entry(dp) char *dp; { DIR *dirp; if ((dirp=opendir(dp))!=NULL) { (void)closedir(dirp); return; } #ifndef _UNIX_ strlwr(dp); #endif /* _UNIX_ */ /* extension() will corrupt dp on purpose */ if (!strcmp(extension(dp),EXT+1)) create(dp); } static void search_dir(name) char *name; { DIR *dirp; struct dirent *dp; if ((dirp = opendir(name)) == NULL) return; for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) add_entry(dp->d_name); (void)closedir (dirp); } static void name_init() { switch (Format) { case MAGIC: (void)strcpy(EXT,".mag"); break; case PCSTR: (void)strcpy(EXT,".str"); break; case TeX: (void)strcpy(EXT,".tex"); break; default: break; } } void name_list() { struct names *tmp; name_init(); switch (Format) { case TeX: case MAGIC: case PCSTR: for(tmp=fhpath;tmp!=NULL;tmp=tmp->next) search_dir(tmp->name); break; case CIF: cif_init(); break; case GDSII: gds_init(); break; case VALID: GED_init(); break; default: break; } } /* names.c */