bert@gufalet.let.rug.nl (Bert Bos) (07/04/90)
I tried to use the Unix system routine `open' to open files in my HP-Pascal program (on a HP 9000/840), but the linker consistently used HP-Pascal's own `open' routine. I tried to declare `open' as `external C' (which worked for other calls), I even tried to uses the $alias compiler option to try to fool the linker, but to no avail. Is there a way around this?-- "Always remember, however, that there's Bert Bos (bert@gufalet.let.rug.nl) usually a simpler and better way to do Alfa-informatica something than the first way that pops RijksUniversiteit Groningen into your head." (D.E. Knuth, TeXbook) Groningen, The Netherlands
ton@hpuamsa.UUCP (Ton 't Lam AEO) (07/05/90)
Hallo, I have piece of code and I remember to have it working. (But it may have been beginner's luck ?!) TYPE PATHNAME = PACKED ARRAY [1..50] OF CHAR; ... FUNCTION open VAR path : PATHNAME; oflag: INTEGER); INTEGER: EXTERNAL; ... BEGIN path = '/dev/hpib9'; path[11] = CHR(0); { The C-open expects that a string is terminated with character zero! } eid = open( path, 2); { 2 = O_RDWR; look also in /usr/include/stdio.h } Another possible solution that will works: FUNCTION $ ALIAS 'open' $ dopen VAR path : PATHNAME; oflag: INTEGER); INTEGER: EXTERNAL; and dopen() is in a so called onionskin, this is a little C-program: dopen( path, oflag) char *path; int oflag; { int eid; if( (eid = open( path, oflag)) == -1) { perror( "Problem "); exit( 1); } return( eid); } Compile the C program as follows: cc -c cprog.c The result is an object file called cprog.o Now do: pc -o pprog pprog.p cprog.o Good luck, Ton 't Lam,
ton@hpuamsa.UUCP (Ton 't Lam AEO) (07/05/90)
I made a little typo. I said: FUNCTION open ( VAR path : PATHNAME; oflag: INTEGER); INTEGER: EXTERNAL; This must be: FUNCTION open ( VAR path : PATHNAME; oflag: INTEGER): <--- INTEGER; <--- EXTERNAL; I exchanged the : and ; By the way thinking it over you don't need an unionskin. $sysprog on$ $underscore on$ program tryit( input, output); const O_RDWR = 2; O_WRONLY = 1; type pathname = packed array[1..81] of char; cstring = packed array[1..81] of char; var eid : integer; err ['_errno'] : integer; path : pathname; str : cstring; len : integer; function $ ALIAS 'open' $ dopen (var path : pathname; oflag : integer) : integer ; external; function $ ALIAS 'close' $ dclose ( fd : integer) : integer ; external; function $ ALIAS 'write' $ send ( fd : integer; var buffer: cstring; nbyte : integer) ; external; begin path = 'filename'; path[9] = chr(0); eid = dopen( path, O_RDWR); if eid = -1 then begin writeln( 'Err: ', err'); halt; end; cstring = 'Just a sentence' + chr( 0); len = strlen( cstring); write( eid, cstring, len); { something like this } dclose( eid); end. This will do. You may want to look in the UNIX reference manual at create(2), open(2), read(2), close(2). Please give a little reply, if it went fine. Regards, Ton 't Lam.
bigelow@hpfcso.HP.COM (Jim Bigelow) (07/24/90)
Regarding the problem of having the linker always pick the pascal open rather then the unix system call open, try explicitly including libc.a on the compile line, e.g., pc prog.p -lc This will cause libc.a to be searched *before* libpc.a by generating the following ld line: /bin/ld /lib/crt0.o prog.o -lc -x -lpc -lm -lc Note that libc.a is on the command line twice, the second reference will statisfy libpc.a calls to unix and C. Best regards, Jim Bigelow S300 Pascal Colorado Language Lab Hewlett Packard.