00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #include <stdio.h>
00042 #include "memvirtu.h"
00043 #include "lowparam.h"
00044 #include "lowsolid.h"
00045 #include "eulerops.h"
00046
00047 #ifdef __VIRTUAL_MEM
00048 extern unsigned nodesize[];
00049
00050 int NumRecordsVM[10] = { 10, 10, 50, 50, 200, 200, 100, 10, 10, 10 };
00051 char *ArqVirtualMemory[] =
00052 {
00053 "VIRSOLID.TMP", "VIRSHELL.TMP", "VIRFACE_.TMP", "VIRLOOP.TMP",
00054 "VIREDGE_.TMP", "VIRHALFE.TMP", "VIRVERTX.TMP", "VIRAXIS.TMP",
00055 "VIRGROUP.TMP", 0,
00056 };
00057
00058 void MSD_highIniciateMemVirtual(void)
00059 {
00060 FILE *fp;
00061
00062 if ((fp = fopen("uspdesin.mem", "r")) != (FILE *)NULL)
00063 {
00064 fscanf(fp, "%d", &NumRecordsVM[0]);
00065 fscanf(fp, "%d", &NumRecordsVM[1]);
00066 fscanf(fp, "%d", &NumRecordsVM[2]);
00067 fscanf(fp, "%d", &NumRecordsVM[3]);
00068 fscanf(fp, "%d", &NumRecordsVM[4]);
00069 fscanf(fp, "%d", &NumRecordsVM[5]);
00070 fscanf(fp, "%d", &NumRecordsVM[6]);
00071 fscanf(fp, "%d", &NumRecordsVM[7]);
00072 fscanf(fp, "%d", &NumRecordsVM[8]);
00073 fclose(fp);
00074 }
00075
00076 MSD_lowIniciateMemVirtual(SOLID);
00077 MSD_lowIniciateMemVirtual(SHELL);
00078 MSD_lowIniciateMemVirtual(FACE);
00079 MSD_lowIniciateMemVirtual(LOOP);
00080 MSD_lowIniciateMemVirtual(EDGE);
00081 MSD_lowIniciateMemVirtual(HALFEDGE);
00082 MSD_lowIniciateMemVirtual(VERTEX);
00083 MSD_lowIniciateMemVirtual(GROUP);
00084 MSD_lowIniciateMemVirtual(AXIS);
00085
00086 init_v_array("EULEROPS.TMP", sizeof(EulerOp), ' ');
00087 EulerOpsArray = (VACB *)open_v_array("EULEROPS.TMP", 500);
00088 }
00089
00090 void MSD_highTerminateMemVirtual(void)
00091 {
00092 MSD_lowTerminateMemVirtual(SOLID);
00093 MSD_lowTerminateMemVirtual(SHELL);
00094 MSD_lowTerminateMemVirtual(FACE);
00095 MSD_lowTerminateMemVirtual(LOOP);
00096 MSD_lowTerminateMemVirtual(EDGE);
00097 MSD_lowTerminateMemVirtual(HALFEDGE);
00098 MSD_lowTerminateMemVirtual(VERTEX);
00099 MSD_lowTerminateMemVirtual(GROUP);
00100 MSD_lowTerminateMemVirtual(AXIS);
00101
00102 close_v_array(EulerOpsArray);
00103 remove("EULEROPS.TMP");
00104 }
00105
00106 void MSD_lowIniciateMemVirtual(int what)
00107 {
00108 init_v_array(ArqVirtualMemory[what], nodesize[what], ' ');
00109 VirtualMemoryBlock[what] = (VACB *)open_v_array(ArqVirtualMemory[what],
00110 NumRecordsVM[what]);
00111 ArrayTop[what] = ArrayBottom[what] = 0;
00112 }
00113
00114 long MSD_getMemVirtual(int what)
00115 {
00116 long FreeMemVirtuCell;
00117
00118 FreeMemVirtuCell = ArrayTop[what];
00119 if (ArrayTop[what] == ArrayBottom[what])
00120 {
00121 ArrayTop[what]++;
00122 ArrayBottom[what]++;
00123 }
00124 else
00125 {
00126 switch (what)
00127 {
00128 case SOLID:
00129 ArrayTop[what] = SolNxt(ArrayTop[what]);
00130 break;
00131
00132 case SHELL:
00133 ArrayTop[what] = SheNextD(ArrayTop[what]);
00134 break;
00135
00136 case FACE:
00137 ArrayTop[what] = FacNextF(ArrayTop[what]);
00138 break;
00139
00140 case LOOP:
00141
00142 ArrayTop[what] = LooNextL(ArrayTop[what]);
00143 break;
00144
00145 case EDGE:
00146 ArrayTop[what] = EdgNextE(ArrayTop[what]);
00147 break;
00148
00149 case HALFEDGE:
00150 ArrayTop[what] = HalNextH(ArrayTop[what]);
00151 break;
00152
00153 case VERTEX:
00154 ArrayTop[what] = VerNextV(ArrayTop[what]);
00155 break;
00156
00157 case GROUP:
00158 ArrayTop[what] = GrpNextG(ArrayTop[what]);
00159 break;
00160
00161 case AXIS:
00162 ArrayTop[what] = AxsNextA(ArrayTop[what]);
00163 break;
00164 }
00165 }
00166 return(FreeMemVirtuCell);
00167 }
00168
00169 void MSD_putMemVirtual(long FreePointer, int what)
00170 {
00171 switch (what)
00172 {
00173 case SOLID:
00174 SolNxt(FreePointer) = ArrayTop[what];
00175 break;
00176
00177 case SHELL:
00178 SheNextD(FreePointer) = ArrayTop[what];
00179 break;
00180
00181 case FACE:
00182 FacNextF(FreePointer) = ArrayTop[what];
00183 break;
00184
00185 case LOOP:
00186 LooNextL(FreePointer) = ArrayTop[what];
00187 break;
00188
00189 case EDGE:
00190 EdgNextE(FreePointer) = ArrayTop[what];
00191 break;
00192
00193 case HALFEDGE:
00194 HalNextH(FreePointer) = ArrayTop[what];
00195 break;
00196
00197 case VERTEX:
00198 VerNextV(FreePointer) = ArrayTop[what];
00199 break;
00200
00201 case GROUP:
00202 GrpNextG(FreePointer) = ArrayTop[what];
00203 break;
00204
00205 case AXIS:
00206 AxsNextA(FreePointer) = ArrayTop[what];
00207 break;
00208 }
00209 ArrayTop[what] = FreePointer;
00210 }
00211
00212 void MSD_lowTerminateMemVirtual(int what)
00213 {
00214 close_v_array(VirtualMemoryBlock[what]);
00215 remove(ArqVirtualMemory[what]);
00216 }
00217
00218 #endif