예제 #1
0
static int
processStream(const XML_Char *filename, XML_Parser parser)
{
  /* passing NULL for filename means read intput from stdin */
  int fd = 0;   /* 0 is the fileno for stdin */

  if (filename != NULL) {
    fd = topen(filename, O_BINARY|O_RDONLY);
    if (fd < 0) {
      tperror(filename);
      return 0;
    }
  }
  for (;;) {
    int nread;
    char *buf = (char *)XML_GetBuffer(parser, READ_SIZE);
    if (!buf) {
      if (filename != NULL)
        close(fd);
      ftprintf(stderr, T("%s: out of memory\n"),
               filename != NULL ? filename : "xmlwf");
      return 0;
    }
    nread = read(fd, buf, READ_SIZE);
    if (nread < 0) {
      tperror(filename != NULL ? filename : "STDIN");
      if (filename != NULL)
        close(fd);
      return 0;
    }
    if (XML_ParseBuffer(parser, nread, nread == 0) == XML_STATUS_ERROR) {
      reportError(parser, filename != NULL ? filename : "STDIN");
      if (filename != NULL)
        close(fd);
      return 0;
    }
    if (nread == 0) {
      if (filename != NULL)
        close(fd);
      break;;
    }
  }
  return 1;
}
예제 #2
0
int
filemap(const tchar *name,
        void (*processor)(const void *, size_t, const tchar *, void *arg),
        void *arg)
{
  size_t nbytes;
  int fd;
  _EXPAT_read_count_t n;
  struct stat sb;
  void *p;

  fd = topen(name, O_RDONLY|O_BINARY);
  if (fd < 0) {
    tperror(name);
    return 0;
  }
  if (fstat(fd, &sb) < 0) {
    tperror(name);
    close(fd);
    return 0;
  }
  if (!S_ISREG(sb.st_mode)) {
    ftprintf(stderr, T("%s: not a regular file\n"), name);
    close(fd);
    return 0;
  }
  if (sb.st_size > XML_MAX_CHUNK_LEN) {
    close(fd);
    return 2;  /* Cannot be passed to XML_Parse in one go */
  }

  nbytes = sb.st_size;
  /* malloc will return NULL with nbytes == 0, handle files with size 0 */
  if (nbytes == 0) {
    static const char c = '\0';
    processor(&c, 0, name, arg);
    close(fd);
    return 1;
  }
  p = malloc(nbytes);
  if (!p) {
    ftprintf(stderr, T("%s: out of memory\n"), name);
    close(fd);
    return 0;
  }
  n = _EXPAT_read(fd, p, (_EXPAT_read_req_t)nbytes);
  if (n < 0) {
    tperror(name);
    free(p);
    close(fd);
    return 0;
  }
  if (n != (_EXPAT_read_count_t)nbytes) {
    ftprintf(stderr, T("%s: read unexpected number of bytes\n"), name);
    free(p);
    close(fd);
    return 0;
  }
  processor(p, nbytes, name, arg);
  free(p);
  close(fd);
  return 1;
}
예제 #3
0
파일: tpcheck.c 프로젝트: abhijit13/p2c
Typeptr TpCheckGetTypePtr(char *idname,int *currlevel,
		int *foundlevel,int *type,char *buf)
{  Argptr aptr;
   Varptr vptr;
   Constptr cptr;
   Funptr fptr;
  Typeptr tptr;
   printf("\n In TpCheckGetTypePtr"); getchar();
   fptr=currfun; 
   while(fptr)
   {  vptr=fptr->varlist;
      while(vptr)
      {   if(mystrcmp(idname,vptr->name)==0)
	  { 	*foundlevel=fptr->level;
		*currlevel=currfun->level;
		*type=1; // local var in W.
	      printf("\n %s found , in func %s variable ",idname,fptr->fname);	
	      getchar();
	        return vptr->type;
	  }
	  else vptr=vptr->nxt;
       }
      aptr=fptr->arglist;
      while(aptr)
      {   if(mystrcmp(idname,aptr->name)==0)
	  { 	*foundlevel=fptr->level;
		*currlevel=currfun->level;
		if(aptr->arg_type==VAR_PARAM) *type=2; //var param
		else *type=3; // value param
	      printf("\n %s found , in func %s arg ",idname,fptr->fname);	
	      getchar();
	        return aptr->type;
	  }
	  else aptr=aptr->nxt;
      }
      cptr=fptr->constlist;
      while(cptr)
      {  if(mystrcmp(idname,cptr->name)==0)
	  { 	*foundlevel=fptr->level;
		*currlevel=currfun->level;
		*type=4;
	      printf("\n %s found , in func %s const ",idname,fptr->fname);	
	      getchar();
		if(cptr->const_type==CONST_INT) return basic_types;
		else if(cptr->const_type==CONST_REAL) return basic_types+1;
		else if(cptr->const_type==CONST_CHAR) return basic_types+2;
	  }
	  else cptr=cptr->nxt;
      }
      tptr=currfun->typelist;
      while(tptr)
      { if(tptr->type_type==ENUM_TYPE)
	      { Idptr idptr;
		idptr=tptr->idlist;
		while(idptr)
		{ if(mystrcmp(idname,idptr->idname)==0)
			{    *foundlevel=fptr->level;
			       *currlevel=currfun->level;
		       	   *type=6;	       
				return basic_types;
			}
		  idptr=idptr->nxt;		
		}
	      }
	 tptr=tptr->nxt;     
      }
      if(mystrcmp(idname,fptr->fname)==0)
      { if(fptr==currfun)
	   if(fptr->ret_type)
	  {
		  *foundlevel=fptr->level;
		 *currlevel=currfun->level;
		 *type=5;
		 printf("\n %s found , in func %s fname itself ",
				 idname,fptr->fname);	
		 getchar();
		 strcpy(buf,fptr->ret_value_name);
		 return fptr->ret_type;
	  }
	   else tperror(PROCEDURE_RET_TYPE_REF);
	else tperror(OUT_OF_SCOPE_REF);
      }
     fptr=fptr->parent;	   
   }
   printf("\n %s not found ",idname); getchar();
   return NULL; 
}