00001 #include "machine.h"
00002 #include "genmdiag.h"
00003 typedef signed char integer1;
00004 typedef short integer2;
00005
00006 #define Min(x,y) (((x)<(y))?(x):(y))
00007 #define Max(x,y) (((x)>(y))?(x):(y))
00008
00009 #define MDIAG(Type) {\
00010 Type *DX;\
00011 Type *DY;\
00012 DX=(Type *)dx;\
00013 --DX;\
00014 DY=(Type *)dy;\
00015 if (*k>=0)\
00016 ix=1+(*k)*(*m);\
00017 else\
00018 ix=1-(*k);\
00019 for (i = 0; i < mn; ++i) \
00020 DY[i] = DX[ix+i*(*m+1)];\
00021 }
00022
00023
00024 int C2F(genmdiag)(typ,m,n,k,dx,dy)
00025 integer *n;
00026 integer *m;
00027 integer *k;
00028 integer *typ;
00029 int *dx;
00030 int *dy;
00031 {
00032 static integer i, ix, mn;
00033
00034 if (*k >= 0)
00035 mn=Max(0,Min(*m,*n-*k));
00036 else
00037 mn=Max(0,Min(*m+*k,*n));
00038
00039 switch (*typ) {
00040 case 1:
00041 MDIAG(integer1);
00042 break;
00043 case 2:
00044 MDIAG(integer2);
00045 break;
00046 case 4:
00047 MDIAG(integer);
00048 break;
00049 case 11:
00050 MDIAG(unsigned char);
00051 break;
00052 case 12:
00053 MDIAG(unsigned short);
00054 break;
00055 case 14:
00056 MDIAG(unsigned int);
00057 break;
00058 }
00059 return 0;
00060 }
00061