summaryrefslogtreecommitdiff
path: root/utils/prof/cgprof/matrix.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/prof/cgprof/matrix.c')
-rw-r--r--utils/prof/cgprof/matrix.c98
1 files changed, 98 insertions, 0 deletions
diff --git a/utils/prof/cgprof/matrix.c b/utils/prof/cgprof/matrix.c
new file mode 100644
index 0000000000..b4ca43f96b
--- /dev/null
+++ b/utils/prof/cgprof/matrix.c
@@ -0,0 +1,98 @@
+/* ------------------------------------------------------------------------
+ * $Id: matrix.c,v 1.3 2006/01/09 14:32:31 simonmar Exp $
+ *
+ * Copyright (C) 1995-2000 University of Oxford
+ *
+ * Permission to use, copy, modify, and distribute this software,
+ * and to incorporate it, in whole or in part, into other software,
+ * is hereby granted without fee, provided that
+ * (1) the above copyright notice and this permission notice appear in
+ * all copies of the source code, and the above copyright notice
+ * appear in clearly visible form on all supporting documentation
+ * and distribution media;
+ * (2) modified versions of this software be accompanied by a complete
+ * change history describing author, date, and modifications made;
+ * and
+ * (3) any redistribution of the software, in original or modified
+ * form, be without fee and subject to these same conditions.
+ * --------------------------------------------------------------------- */
+
+/* Not very clever sparse representation of a matrix. However, it will do
+ * for the call graph profiler.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "matrix.h"
+
+Matrix newMat(int rows,int cols, int elsize, void *zero) {
+ Matrix res;
+
+ res.elsize= elsize;
+ res.zero = malloc(elsize);
+ if (res.zero==NULL) {
+ fprintf(stderr,"{newMat} unable to allocate storage\n");
+ exit(1);
+ }
+ memcpy(res.zero,zero,elsize);
+ res.rows = rows;
+ res.cols = cols;
+ res.mat=NULL;
+ return res;
+}
+
+void freeMat(Matrix *mat) {
+ Matrix_element *tmp_ptr, *ptr=mat->mat;
+ free(mat->zero);
+
+ while(ptr!=NULL) {
+ free(ptr->data);
+ tmp_ptr = ptr->next;
+ free(ptr);
+ ptr=tmp_ptr;
+ }
+}
+
+void *_Mat(Matrix *mat,int x, int y,int lineno, char *filename) {
+ Matrix_element *ptr= mat->mat;
+ if (x<0 || x>=mat->rows || y<0 || y>=mat->cols) {
+ fprintf(stderr,"Mat[%d,%d] out of bound index at line %d of \"%s\"\n",
+ x,y,lineno,filename);
+ exit(1);
+ }
+ while(ptr) {
+ if ((x==ptr->x) && (y==ptr->y)) {
+ return ptr->data;
+ }
+ ptr=ptr->next;
+ }
+ /* Not in list */
+ ptr = (Matrix_element*) malloc(sizeof(Matrix_element));
+ if (ptr==NULL) {
+ fprintf(stderr,"{_Mat} failed to allocate %zd bytes\n",
+ sizeof(Matrix_element));
+ exit(1);
+ }
+ ptr->data = (void*) malloc(mat->elsize);
+ if (ptr->data==NULL) {
+ fprintf(stderr,"{_Mat} failed to allocate element of size %d bytes\n",
+ mat->elsize);
+ exit(1);
+ }
+ ptr->x=x;
+ ptr->y=y;
+ memcpy(ptr->data,mat->zero,mat->elsize);
+ ptr->next=mat->mat;
+ mat->mat=ptr;
+ return ptr->data;
+}
+
+int Mat_dense(Matrix mat,int x,int y) {
+ Matrix_element *ptr= mat.mat;
+ while (ptr) {
+ if ((x==ptr->x) && (y==ptr->y)) return 1;
+ ptr=ptr->next;
+ }
+ return 0;
+}