source: git/Singular/p_Procs_Dynamic.cc @ 5cfef2

fieker-DuValspielwiese
Last change on this file since 5cfef2 was 7e5a38, checked in by Olaf Bachmann <obachman@…>, 23 years ago
* dynamic loading of p_Procs git-svn-id: file:///usr/local/Singular/svn/trunk@4833 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 6.4 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/***************************************************************
5 *  File:    p_Procs_Dynamic.cc
6 *  Purpose: source for dynamically loaded version of p_Procs
7 *  Author:  obachman (Olaf Bachmann)
8 *  Created: 8/00
9 *  Version: $Id: p_Procs_Dynamic.cc,v 1.1 2000-12-07 15:03:59 obachman Exp $
10 *******************************************************************/
11#include "mod2.h"
12#include "structs.h"
13#include "p_polys.h"
14#include "ring.h"
15#include "p_Procs.h"
16#include "p_Numbers.h"
17#include "p_MemCmp.h"
18#include "p_MemAdd.h"
19#include "p_MemCopy.h"
20#include "kbuckets.h"
21#include "dError.h"
22
23BOOLEAN p_procs_dynamic = TRUE;
24
25// no external linkage
26#define LINKAGE
27#include "p_Procs_Dynamic.inc"
28
29#include "p_Procs_Dynamic.h"
30// include general p_Proc stuff
31#include "p_Procs_Impl.h"
32#include "mod_raw.h"
33
34// define to bound for length of p_Proc name
35#define MAX_PROCNAME_LEN 200
36
37static void* p_procs_handle = NULL;
38void InitSetDynamicProcs()
39{
40  if (p_procs_handle == NULL)
41    p_procs_handle =  dynl_open_binary_warn("p_Procs");
42}
43#define InitSetProcs(f, l, o) InitSetDynamicProcs()
44
45
46void* GetGeneralProc(p_Proc proc)
47{
48  switch(proc)
49  {
50      case p_Copy_Proc: 
51        return p_Copy__FieldGeneral_LengthGeneral_OrdGeneral;
52      case p_Delete_Proc: 
53        return p_Delete__FieldGeneral_LengthGeneral_OrdGeneral;
54      case p_ShallowCopyDelete_Proc: 
55        return p_ShallowCopyDelete__FieldGeneral_LengthGeneral_OrdGeneral;
56      case p_Mult_nn_Proc: 
57        return p_Mult_nn__FieldGeneral_LengthGeneral_OrdGeneral;
58      case pp_Mult_nn_Proc: 
59        return pp_Mult_nn__FieldGeneral_LengthGeneral_OrdGeneral;
60      case pp_Mult_mm_Proc: 
61        return pp_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral;
62      case pp_Mult_mm_Noether_Proc: 
63        return pp_Mult_mm_Noether__FieldGeneral_LengthGeneral_OrdGeneral;
64      case p_Mult_mm_Proc: 
65        return p_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral;
66      case p_Add_q_Proc: 
67        return p_Add_q__FieldGeneral_LengthGeneral_OrdGeneral;
68      case p_Minus_mm_Mult_qq_Proc: 
69        return p_Minus_mm_Mult_qq__FieldGeneral_LengthGeneral_OrdGeneral;
70      case p_Neg_Proc: 
71        return p_Neg__FieldGeneral_LengthGeneral_OrdGeneral;
72      case pp_Mult_Coeff_mm_DivSelect_Proc: 
73        return pp_Mult_Coeff_mm_DivSelect__FieldGeneral_LengthGeneral_OrdGeneral;
74      case p_Merge_q_Proc: 
75        return p_Merge_q__FieldGeneral_LengthGeneral_OrdGeneral;
76      case p_kBucketSetLm_Proc: 
77        return p_kBucketSetLm__FieldGeneral_LengthGeneral_OrdGeneral;
78      case p_Unknown_Proc:
79        break;
80  }
81  dReportBug("p_Unknown_Proc");
82  return NULL;
83}
84
85#ifdef RDEBUG
86#include "omalloc.h"
87
88char* GetGeneralProcName(p_Proc proc)
89{
90  switch(proc)
91  {
92      case p_Copy_Proc: 
93        return "p_Copy__FieldGeneral_LengthGeneral_OrdGeneral";
94      case p_Delete_Proc: 
95        return "p_Delete__FieldGeneral_LengthGeneral_OrdGeneral";
96      case p_ShallowCopyDelete_Proc: 
97        return "p_ShallowCopyDelete__FieldGeneral_LengthGeneral_OrdGeneral";
98      case p_Mult_nn_Proc: 
99        return "p_Mult_nn__FieldGeneral_LengthGeneral_OrdGeneral";
100      case pp_Mult_nn_Proc: 
101        return "pp_Mult_nn__FieldGeneral_LengthGeneral_OrdGeneral";
102      case pp_Mult_mm_Proc: 
103        return "pp_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral";
104      case pp_Mult_mm_Noether_Proc: 
105        return "pp_Mult_mm_Noether__FieldGeneral_LengthGeneral_OrdGeneral";
106      case p_Mult_mm_Proc: 
107        return "p_Mult_mm__FieldGeneral_LengthGeneral_OrdGeneral";
108      case p_Add_q_Proc: 
109        return "p_Add_q__FieldGeneral_LengthGeneral_OrdGeneral";
110      case p_Minus_mm_Mult_qq_Proc: 
111        return "p_Minus_mm_Mult_qq__FieldGeneral_LengthGeneral_OrdGeneral";
112      case p_Neg_Proc: 
113        return "p_Neg__FieldGeneral_LengthGeneral_OrdGeneral";
114      case pp_Mult_Coeff_mm_DivSelect_Proc: 
115        return "pp_Mult_Coeff_mm_DivSelect__FieldGeneral_LengthGeneral_OrdGeneral";
116      case p_Merge_q_Proc: 
117        return "p_Merge_q__FieldGeneral_LengthGeneral_OrdGeneral";
118      case p_kBucketSetLm_Proc: 
119        return "p_kBucketSetLm__FieldGeneral_LengthGeneral_OrdGeneral";
120      case p_Unknown_Proc:
121        break;
122  }
123  return "p_Unknown_Proc";
124}
125char* GetDynamicProcName(const char* proc_s, p_Proc proc, 
126                         p_Field field, p_Length length, p_Ord ord)
127{
128  void* proc_ptr = NULL;
129  char proc_name[MAX_PROCNAME_LEN];
130 
131  if (p_procs_handle != NULL && 
132      (field != FieldGeneral || length != LengthGeneral || ord != OrdGeneral))
133  {
134    sprintf(proc_name, "%s__%s_%s_%s", proc_s, 
135            p_FieldEnum_2_String(field), 
136            p_LengthEnum_2_String(length), 
137            p_OrdEnum_2_String(ord));
138    proc_ptr = dynl_sym_warn(p_procs_handle, proc_name);
139    if (proc_ptr != NULL) 
140    {
141      char* name = omStrDup(proc_name);
142      omMarkAsStaticAddr(name);
143      return name;
144    }
145  }
146  return GetGeneralProcName(proc);
147}
148 
149#endif
150
151
152void* GetDynamicProc(const char* proc_s, p_Proc proc, 
153                     p_Field field, p_Length length, p_Ord ord)
154{
155  void* proc_ptr = NULL;
156 
157  if (p_procs_handle != NULL && 
158      (field != FieldGeneral || length != LengthGeneral || ord != OrdGeneral))
159  {
160    char proc_name[MAX_PROCNAME_LEN];
161    sprintf(proc_name, "%s__%s_%s_%s", proc_s, 
162            p_FieldEnum_2_String(field), 
163            p_LengthEnum_2_String(length), 
164            p_OrdEnum_2_String(ord));
165    proc_ptr = dynl_sym(p_procs_handle, proc_name);
166  }
167  if (proc_ptr == NULL)
168    proc_ptr = GetGeneralProc(proc);
169
170  return  proc_ptr;
171}
172 
173
174#define DoReallySetProc(what, field, length, ord)           \
175  _p_procs->what = (what##_Proc_Ptr)                        \
176     GetDynamicProc(#what, what##_Proc, field, length, ord)
177
178#ifdef RDEBUG
179#define DoSetProc(what, field, length, ord)                         \
180do                                                                  \
181{                                                                   \
182  if (set_names)                                                    \
183    _p_procs->what = (what##_Proc_Ptr)                              \
184       GetDynamicProcName(#what,  what##_Proc, field, length, ord); \
185  else                                                              \
186    DoReallySetProc(what, field, length, ord);                      \
187}                                                                   \
188while(0)
189#else
190#define DoSetProc DoReallySetProc
191#endif
192
193     
194#include "p_Procs_Set.h"
195
196
197
198
Note: See TracBrowser for help on using the repository browser.