File: link.c

package info (click to toggle)
scilab 2.2-4
  • links: PTS
  • area: non-free
  • in suites: hamm
  • size: 31,472 kB
  • ctags: 21,963
  • sloc: fortran: 110,983; ansic: 89,717; makefile: 3,016; sh: 1,892; csh: 150; cpp: 101
file content (124 lines) | stat: -rw-r--r-- 3,176 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/*
-------------------------------------------
PROGRAMMES   C  POUR  LE  LINK  DYNAMIQUE  
-------------------------------------------
*/
/* Editeur de liens dynamique pour UNIX.
   permet de rajouter des points d'entrees a un programme en
   cours d'execution. Attention on ne peut par ce moyen remplacer
   un sous-programme lie lors de l'edition de liens initiale.

En  entree :
------------
 ename : chaine de caracteres contenant le nom du point d'entree a rajouter
 loaded_file : chaine de caracteres contenant les noms de fichiers
               necessaires a la definition de ename (Il n'est pas necessaire
               d'ajouter la definition des sous programmes inclus dans
               l'executable initial.
 ii : numero d'ordre du point d'entree . Ce peut etre le numero d'ordre+1
      du dernier point d'entree lie dynamiquement, ou son numero d'ordre
      (au quel cas ce dernier point d'entree est detruit et remplace par
      ename), ou 0 si ename est le premier sous programme a etre lie.

En sortie:
----------
 err : indicateur d'erreur :
       0 si ok
       >0 sinon
 epoints : tableau statique contenant l'adresse de chacun des points
           d'entrees lies dynamiquement. Peut etre utlise par dyncall
           pour faire executer les sous programmes ainsi lies.

Origine: Michael Fan (Andre Tits)

*/

#include "../machine.h"


/*
 Appel de dynload a partir de fortran .
 i : numero d'ordre du point d'entree a definir
 fname  : chaime de caracteres fortran contenant la liste des fichiers
          necessaires a l'edition de liens.
 lf : taille de lf
 spname : chaine de caracteres fortran contenant le nom du point d'entree
 ls : longueur de spname
 err : indicateur d'erreur

 Origine: S Steer INRIA 1988
*/

/** for debug info **/
/** #define DEBUG  **/


#if defined(__STDC__)
void C2F(dynstr)(int *isfor,int *i,char fname[],int *lf,char spname[],int *ls,int *err)
#else
void C2F(dynstr)(isfor,i,fname,lf,spname,ls,err)
int *isfor,*i;char fname[];int *lf;char spname[];int *ls;int *err;
#endif

{
  char enamebuf[80];
  char *ename1;

  fname[*lf]='\0';
  spname[*ls]='\0';
  Underscores(*isfor,spname,enamebuf);
  ename1=enamebuf;
  C2F(dynload)(i,ename1,fname,err) ;
  return;
}

#if (defined(sun) && defined(SYSV)) || defined(__alpha) || defined(sgi)
#include "SYSV_link.c"
#else
#if defined(sun) ||  defined(mips) || defined(_IBMR2) || defined(hppa)
#ifdef SUNOSDLD 
#include "linux_link.c"
#else 
#include "std_link.c"
#endif /* end of SUNOSDLD */
#else
#if defined(linux)
#ifdef __ELF__
#include "SYSV_link.c"
#else
#include "linux_link.c"
#endif 
#else
C2F(dynload)() {cerro("Dynamic link not implemented");}
C2F(dyncall)() {cerro("Dynamic link not implemented");}
#endif
#endif 
#endif 

#ifdef WLU
#ifndef DLDLINK 
#define WLU1 /* dld will add the leading _ itself */
#endif 
#endif 

Underscores(isfor,ename,ename1)
char ename[],ename1[];
int isfor;
    {
   int k1,i;
   k1=0;
#ifdef WLU1
   ename1[0]='_';
   k1=1;
#endif
   for (i=0;i< (int)strlen(ename);i++) ename1[i+k1]=ename[i];
   k1=k1+strlen(ename);
#ifdef WTU
   if (isfor==1) {
       ename1[k1]='_';
       k1=k1+1;
   }
#endif
   ename1[k1]='\0';
   return;
}