home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / prolog / library / diverses / param.pro < prev    next >
Text File  |  1991-08-03  |  2KB  |  84 lines

  1.  
  2. /*
  3.  * param.pro -- 5/6/'86
  4.  *
  5.  * this program demonstrates how to access the command line
  6.  * parameters from a turbo prolog program.  
  7.  *
  8.  * we use a dos function $62 if the version of dos is
  9.  * 3.0 or greater, and function $51 for 2.xx (an undocumented
  10.  * function)  the potential problem is that certain nameless
  11.  * programs install themselves on function $51, so be warned.
  12.  */
  13.  
  14. include "EXAMPL66.PRO" /* This example includes some */
  15.                        /* handy DOS routines */
  16.  
  17. domains
  18.     strlist = string*
  19. predicates
  20.     write_list(strlist)
  21.    
  22. clauses
  23.     write_list([]).
  24.     write_list([H|T]) :-
  25.         write(H, " "),
  26.         write_list(T).
  27.     
  28. predicates
  29.     get_psp(integer)
  30.     get_params(string, integer)
  31.     m_p(string, integer, integer, strlist, strlist)
  32.     cmd_line(integer, strlist)
  33.     append(strlist, strlist, strlist)
  34.  
  35. clauses
  36.     /* get the psp segment 
  37.      * first clause is for version 3.0 or higher
  38.      */
  39.     get_psp(PSP) :-
  40.         dosver(Version),
  41.         Version >= 3.0, 
  42.         !,
  43.         bios($21,reg($6200,0,0,0,0,0,0,0),
  44.                  reg(_,PSP,_,_,_,_,_,_)).
  45.     /* for version 2.xx */
  46.     get_psp(PSP) :-
  47.         !,
  48.         bios($21,reg($5100,0,0,0,0,0,0,0),
  49.                  reg(_,PSP,_,_,_,_,_,_)).
  50.    
  51.     /* get parameter vector */  
  52.     get_params(P_string, PSP) :-
  53.         ptr_dword(P, PSP, $81),
  54.         frontchar(P, _, P_string).
  55.  
  56.     /* split vector into list of strings */
  57.     m_p(P, Ac, Ac, Av, Av) :-
  58.        frontchar(P, C, _),
  59.        char_int(C, N),
  60.        N = 13.
  61.     m_p(P, Ac, T, Av, V) :-
  62.        fronttoken(P, S1, P1),
  63.        !,
  64.        append(V, [S1], V1),
  65.        T1 = T + 1,
  66.        m_p(P1, Ac, T1, Av, V1).
  67.         
  68.     /* make typical argc, argv form for convience */
  69.     cmd_line(Argc, Argv) :-
  70.        get_psp(PSP),
  71.        get_params(P, PSP),
  72.        m_p(P, Argc, 0, Argv, []).
  73.  
  74.     
  75.     append([], X, X).
  76.     append([H|T], L1, [H|L2]) :-
  77.         append(T, L1, L2).
  78.    
  79. goal
  80.     clearwindow,
  81.     cmd_line(Ac, Av),
  82.     write(Ac), nl,
  83.     write_list(Av), nl.
  84.