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; }
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; }