jasonf@cetemp.Eng.Sun.COM (Jason Freund) (08/28/90)
I am calling a C routines from a Pascal program to (among other things)
change directories. I am using several other C routines to do other system
calls and only the ones that get arguments (such as cstr) passed to them fail.
What is wrong with:
------------------------system_cd.c-------------------
#include <stdio.h>
system_cd (cstr)
char *cstr;
{
char cmnd[50];
sprintf(cmnd,"cd %s",cstr);
printf(cmnd);
system(cmnd);
}
---------------------------------------------------------
it's declared in the pascal part like:
procedure system_cd (cstr: string); external c;
and called like: {s is a string}
system_cd(substr(s, 4, length(trim(s))));
Simple calls like "system_pwd() { system("pwd") }" work perfectly.
follow up to : jasonf@cetemp.Corp.sun.com
Thanks,
Jason Freund, Sun Microsystems, jasonf@cetemp.Corp.sun.com <== summer address
Deprtmnt of Computer Science, Univ California, Davis. freund@sakura.ucdavis.edu
Quantum Link: JasonF5, Compu$erve: 72007,244, 690 Erie Dr, Sunnyvale, CA 94087
-------------------------------------------------------------------------------
STOLEN QUOTES -- Please give the authors credit if you know who they are!
"To understand recursion, you need to understand recursion."
"Wow! Virtual memory! Now I'm gonna build me a REALLY big ram disk!"
"My other computer is a SUN3/50." "E. Pluribus UNIX" -- authors unkown jourdan@minos.inria.fr (Martin Jourdan) (08/28/90)
What do you mean by "the routines fail"? Is it that they don't get
compiled correctly? Or they don't receive correct arguments from
Pascal? I used several C routines from Pascal programs and never had
any problem.
BUT... using ``system("cd xxx")'' is bound to fail (i.e., return without
any observable effect) when called either from C or from Pascal. The
reason is that "system" spawns a shell to execute the command. The
shell will change its **own** directory but **not the one of its parent
process** (the Pascal program).
You'd better re-read your Unix manual...
Martin Jourdan <jourdan@minos.inria.fr>, INRIA, Rocquencourt, France.
Why do we need all these %$#@%$# disclaimers?!?jasonf@cetemp.Eng.Sun.COM (Jason Freund) (08/28/90)
I changed the code to use "chdir()", compiled it with
"cc -c system_cd.c", compiled it with the pascal main, and it runs without
crashing at all. But it still doesn't work. It never actually changes
directories. Here's the code:
----------------------------system_cd.c-------------------------------
include <stdio.h>
system_cd (cstr)
char *cstr;
{
chdir(cstr);
}
- - - - - - - - - - in calling pascal procedure:- - - - - - - - - - - - -
procedure system_cd(cstr: string); external c;
{is declared as procedure within procedure that calls it}
:
system_cd(substr(t1,4,length(trim(t1))));
{trim: cuts off trailing spaces, t1 is string, ie "cd test",
substr(t1,4,length(trim(t1))) would be "test"}
============================================================================
Also, why doesn't my date function work? I want the system command to
get the date and chuck it back into the pascal calling program so that it can
be encoded:
-------------------------------system_date.c------------------------------
#include <stdio.h>
system_date (str)
char *str;
{
sprintf(str, (system("/usr/bin/date")));
}
- - - - - - - - - - in calling pascal procedure:- - - - - - - - - - - - -
procedure system_date(var s: string); external c;
:
:
system_date(s);
writeln(s);
...gets:
*** Program execution terminated by segmentation violation
???()
???()
In system_date () ... after I compile and run it.
----------------------------------------------------------------------------
Any ideas for either case? I'm using Sun Pascal 2.0, on a 3/50 OS 4.1 machine.
Jason Freund