summaryrefslogtreecommitdiff
path: root/support/dktools/dk3info.ctr
blob: 36e4ebc8ccc2bd81dcf17d0b8fb85b7860e984fb (plain)
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
%%	options


%%	module

#include "dk3all.h"
#include "dk3sf.h"
#include "dk3info1.c"


/**	Option names for configure.
*/
static dkChar const *option_names[] = {
$!string-table	macro=dkT
--prefix=
--sysconfdir=
--datarootdir=
--localstatedir=
--bindir=
--sbindir=
--libdir=
--includedir=
--mandir=
--execprefix=
--libexecdir=
$!end
};



/**	Options order.
*/
static size_t option_order[] = {
  0, 1, 3, 2, 4, 5, 6, 7, 8, 10
};



/**	Number of options.
*/
static size_t num_options = (sizeof(option_order))/sizeof(size_t);



/**	Application group name.
*/
static dkChar const dk3info_group_name[] = { dkT("dktools") };



/**	Print the information.
	@param	app		Application structure.
	@param	longvers	Flag: Print long version.
*/
static
void
run_with_app(dk3_app_t *app, int longvers)
{
  dkChar const	*val;		/* Directory value (compiled). */
  dkChar const	*xval;		/* Directory value (actually used). */
  size_t	 maxlgt = 0;	/* Maximum option name length. */
  size_t	 lgt;		/* Current option name length. */
  size_t	 i;		/* Traverse all options. */
  size_t	 k;		/* Print space. */
  size_t	 di;		/* Directory index. */
  int		 mp;		/* Flag: Must print actual data. */

  /*	Find maximum length of option names.
  */
  for(i = 0; i < num_options; i++) {
    di = option_order[i];
    /* ##### Count number of screen positions! */
    lgt = dk3str_len(option_names[di]);
    if(lgt > maxlgt) { maxlgt = lgt; }
  }
  /*	Now print the information.
  */
  dk3sf_initialize_stdout();
  for(i = 0; i < num_options; i++) {
    di = option_order[i];
    lgt = dk3str_len(option_names[di]);
    if(lgt < maxlgt) {
      lgt = maxlgt - lgt;
      while(lgt--) {
        dk3sf_fputc(dkT(' '), stdout);
      }
    }
    dk3sf_fputs(option_names[di], stdout);
    val = dk3inst_get_directory(di);
    if(val) {
      dk3sf_fputs(val, stdout);
    }
    dk3sf_fputc(dkT('\n'), stdout);
    if(app) {
      xval = NULL;
      mp = 1;
      switch(di) {
        case DK3_INST_SYSCONF: xval = dk3app_get_etcdir(app); break;
	case DK3_INST_DATAROOT: xval = dk3app_get_sharedir(app); break;
	case DK3_INST_BIN: xval = dk3app_get_bindir(app); break;
	case DK3_INST_LOCALSTATE: xval = dk3app_get_vardir(app); break;
      }
      if(xval) {
        if(val) {
	  if(0 == dk3str_fncmp(val, xval)) {
	    mp = 0;
	  }
	}
        if(mp) {
	  for(k = 0; k < maxlgt; k++) dk3sf_fputc(dkT(' '), stdout);
	  dk3sf_fputs(xval, stdout);
	  dk3sf_fputc(dkT('\n'), stdout);
	}
      }
    }
  }
  if(longvers) {
    show_defines();
  }
}



/**	The main function.
	@param	argc	Number of command line arguments.
	@param	argv	Command line arguments array.
	@return	0 on success, all other values indicate errors.
*/
DK3_MAIN
{
  dk3_app_t		*app = NULL;
  dkChar const * const	*xargv;
  int			 longvers = 0;
  int			 xargc;
  app = dk3app_open_command(
    argc, (dkChar const * const *)argv, dk3info_group_name
  );
  if(app) {
    xargc = dk3app_get_argc(app);
    xargv = dk3app_get_argv(app);
    if(1 < xargc) {
      if(dk3str_cmp(xargv[1], dkT("-l")) == 0) {
        longvers = 1;
      }
    }
    run_with_app(app, longvers);
    dk3app_close(app);
  } else {
    if(1 < argc) {
      if(dk3str_cmp(argv[1], dkT("-l")) == 0) {
        longvers = 1;
      }
    }
    run_with_app(NULL, longvers);
  }
  fflush(stdout);
  exit(0); return 0;
}