예제 #1
0
static mmap_t* mmap_init(const char* fn,uint32_t flags)
{
  if(!fn)  return 0;
  struct stat st;
  if(stat(fn,&st) || ! (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)))
  {
    if(flags&MIME_FLAG_VERBOSE)
      fprintf(stderr,"Source file %s not exists or not plain : %s\n",fn,strerror(errno));
    return 0;
  }

  FILE *f=0;
  if(!(f=fopen(fn,"r")))
  {
    if(flags&MIME_FLAG_VERBOSE)
      fprintf(stderr,"Can not open file %s : %s\n",fn,strerror(errno));
    return 0;
  }

  void* ptr=mmap(0,st.st_size,PROT_READ,MAP_PRIVATE,fileno(f),0);

  if(ptr==(void*)-1)
  {
    if(flags&MIME_FLAG_VERBOSE)
      fprintf(stderr,"Can not read file %s : %s\n",fn,strerror(errno));
    fclose(f);
    return 0;
  }

  mmap_t* rv=md_new(rv);
  rv->f=f;
  rv->data=ptr;
  rv->sz=st.st_size;
  return rv;
}
예제 #2
0
matrix_double md_product(const matrix_double m1, const matrix_double m2) {
	matrix_double ans = {NULL, 0, 0};
	if (!md_is_empty(m1) && !md_is_empty(m2) && m1.cols == m2.rows) {
		ans = md_new(m1.rows, m2.cols);
		if (!md_is_empty(ans)) {
			uint x, y, e;
			for (y = 0; y < ans.rows; y++)
				for (x = 0; x < ans.cols; x++)
					for (e = 0; e < m1.cols; e++)
						(ans.data)[y][x] += (m1.data)[y][e] * (m2.data)[e][x];
		}
	}
	return ans;
}