Subversion Repositories SvarDOS

Rev

Rev 417 | Rev 421 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 417 Rev 420
Line 27... Line 27...
27
 *       filter within FindFirst.
27
 *       filter within FindFirst.
28
 *
28
 *
29
 * NOTE: Multiple /A are not supported - only the last one is significant.
29
 * NOTE: Multiple /A are not supported - only the last one is significant.
30
 */
30
 */
31
 
31
 
-
 
32
#define WCOLWIDTH 15  /* width of a column in wide mode output */
-
 
33
 
32
static int cmd_dir(struct cmd_funcparam *p) {
34
static int cmd_dir(struct cmd_funcparam *p) {
33
  const char *filespecptr = NULL;
35
  const char *filespecptr = NULL;
34
  struct DTA *dta = (void *)0x80; /* set DTA to its default location at 80h in PSP */
36
  struct DTA *dta = (void *)0x80; /* set DTA to its default location at 80h in PSP */
35
  unsigned short i;
37
  unsigned short i;
36
  unsigned short availrows;  /* counter of available rows on display (used for /P) */
38
  unsigned short availrows;  /* counter of available rows on display (used for /P) */
-
 
39
  unsigned short wcols = screen_getwidth() / WCOLWIDTH; /* number of columns in wide mode */
-
 
40
  unsigned char wcolcount;
-
 
41
  struct nls_patterns *nls = (void *)(p->BUFFER + (BUFFER_SIZE / 3));
-
 
42
  char *buff2 = p->BUFFER + (BUFFER_SIZE / 3 * 2);
-
 
43
 
37
  #define DIR_FLAG_PAUSE  1
44
  #define DIR_FLAG_PAUSE  1
38
  #define DIR_FLAG_WIDE   2
-
 
39
  #define DIR_FLAG_RECUR  4
45
  #define DIR_FLAG_RECUR  4
40
  #define DIR_FLAG_BARE   8
-
 
41
  #define DIR_FLAG_LCASE 16
46
  #define DIR_FLAG_LCASE  8
42
  unsigned char flags = 0;
47
  unsigned char flags = 0;
-
 
48
 
-
 
49
  #define DIR_OUTPUT_NORM 1
-
 
50
  #define DIR_OUTPUT_WIDE 2
43
//  unsigned char attribs_show = 0; /* show only files with ALL these attribs */
51
  #define DIR_OUTPUT_BARE 3
44
//  unsigned char attribs_hide = 0; /* hide files with ANY of these attribs */
52
  unsigned char format = DIR_OUTPUT_NORM;
45
 
53
 
46
  if (cmd_ishlp(p)) {
54
  if (cmd_ishlp(p)) {
47
    outputnl("Displays a list of files and subdirectories in a directory");
55
    outputnl("Displays a list of files and subdirectories in a directory");
48
    outputnl("");
56
    outputnl("");
49
    outputnl("DIR [drive:][path][filename] [/P] [/W] [/A[:]attributes] [/O[[:]sortorder]] [/S] [/B] [/L]");
57
    outputnl("DIR [drive:][path][filename] [/P] [/W] [/A[:]attributes] [/O[[:]sortorder]] [/S] [/B] [/L]");
Line 67... Line 75...
67
    outputnl("\r\n*** THIS COMMAND IS NOT FULLY IMPLEMENTED YET ***");
75
    outputnl("\r\n*** THIS COMMAND IS NOT FULLY IMPLEMENTED YET ***");
68
 
76
 
69
    return(-1);
77
    return(-1);
70
  }
78
  }
71
 
79
 
-
 
80
  i = nls_getpatterns(nls);
-
 
81
  if (i != 0) outputnl(doserr(i));
-
 
82
 
72
  /* parse command line */
83
  /* parse command line */
73
  for (i = 0; i < p->argc; i++) {
84
  for (i = 0; i < p->argc; i++) {
74
    if (p->argv[i][0] == '/') {
85
    if (p->argv[i][0] == '/') {
75
      char arg;
86
      char arg;
76
      char neg = 0;
87
      char neg = 0;
Line 85... Line 96...
85
          outputnl("/A NOT IMPLEMENTED YET");
96
          outputnl("/A NOT IMPLEMENTED YET");
86
          return(-1);
97
          return(-1);
87
          break;
98
          break;
88
        case 'b':
99
        case 'b':
89
        case 'B':
100
        case 'B':
90
          flags |= DIR_FLAG_BARE;
101
          format = DIR_OUTPUT_BARE;
-
 
102
          break;
-
 
103
        case 'w':
-
 
104
        case 'W':
-
 
105
          format = DIR_OUTPUT_WIDE;
91
          break;
106
          break;
92
        case 'p':
107
        case 'p':
93
        case 'P':
108
        case 'P':
94
          flags |= DIR_FLAG_PAUSE;
109
          flags |= DIR_FLAG_PAUSE;
95
          if (neg) flags &= (0xff ^ DIR_FLAG_PAUSE);
110
          if (neg) flags &= (0xff ^ DIR_FLAG_PAUSE);
96
          break;
111
          break;
-
 
112
        case 'l':
-
 
113
        case 'L':
-
 
114
          flags |= DIR_FLAG_LCASE;
-
 
115
          break;
97
        default:
116
        default:
98
          outputnl("Invalid switch");
117
          outputnl("Invalid switch");
99
          return(-1);
118
          return(-1);
100
      }
119
      }
101
    } else {  /* filespec */
120
    } else {  /* filespec */
Line 123... Line 142...
123
  if (i != 0) {
142
  if (i != 0) {
124
    outputnl(doserr(i));
143
    outputnl(doserr(i));
125
    return(-1);
144
    return(-1);
126
  }
145
  }
127
 
146
 
128
  if ((flags & DIR_FLAG_BARE) == 0) {
147
  if (format != DIR_OUTPUT_BARE) {
129
    unsigned char drv = p->BUFFER[0];
148
    unsigned char drv = p->BUFFER[0];
130
    char *buff2 = p->BUFFER + (BUFFER_SIZE / 2);
-
 
131
    if (drv >= 'a') {
149
    if (drv >= 'a') {
132
      drv -= 'a';
150
      drv -= 'a';
133
    } else {
151
    } else {
134
      drv -= 'A';
152
      drv -= 'A';
135
    }
153
    }
Line 152... Line 170...
152
    outputnl(doserr(i));
170
    outputnl(doserr(i));
153
    return(-1);
171
    return(-1);
154
  }
172
  }
155
 
173
 
156
  availrows = screen_getheight();
174
  availrows = screen_getheight();
-
 
175
  wcolcount = 0; /* may be used for columns counting with wide mode */
157
 
176
 
158
  outputnl(dta->fname);
-
 
159
  availrows--;
177
  do {
-
 
178
    if (flags & DIR_FLAG_LCASE) _strlwr(dta->fname); /* OpenWatcom extension, probably does not care about NLS so results may be odd with non-A-Z characters... */
160
 
179
 
-
 
180
    switch (format) {
-
 
181
      case DIR_OUTPUT_NORM:
-
 
182
        /* print fname-space-extension (unless it's "." or "..", then print as-is) */
161
  while (findnext(dta) == 0) {
183
        if (dta->fname[0] == '.') {
162
    outputnl(dta->fname);
184
          output(dta->fname);
-
 
185
          i = strlen(dta->fname);
-
 
186
          while (i++ < 12) output(" ");
-
 
187
        } else {
-
 
188
          file_fname2fcb(buff2, dta->fname);
-
 
189
          memmove(buff2 + 9, buff2 + 8, 4);
-
 
190
          buff2[8] = ' ';
-
 
191
          output(buff2);
-
 
192
        }
-
 
193
        output(" ");
-
 
194
        /* either <DIR> or right aligned 10-chars byte size */
-
 
195
        memset(buff2, ' ', 10);
163
    if (flags & DIR_FLAG_PAUSE) {
196
        if (dta->attr & DOS_ATTR_DIR) {
-
 
197
          strcpy(buff2 + 10, "<DIR>");
164
      availrows--;
198
        } else {
-
 
199
          _ultoa(dta->size, buff2 + 10, 10); /* OpenWatcom extension */
-
 
200
        }
-
 
201
        output(buff2 + strlen(buff2) - 10);
-
 
202
        /* two spaces and NLS DATE */
-
 
203
        buff2[0] = ' ';
-
 
204
        buff2[1] = ' ';
-
 
205
        nls_format_date(buff2 + 2, dta->date_yr + 1980, dta->date_mo, dta->date_dy, nls);
-
 
206
        output(buff2);
-
 
207
 
-
 
208
        /* one space and NLS TIME */
-
 
209
        nls_format_time(buff2 + 1, dta->time_hour, dta->time_min, nls);
165
      if (availrows < 2) {
210
        outputnl(buff2);
166
        press_any_key();
211
        break;
-
 
212
 
-
 
213
      case DIR_OUTPUT_WIDE: /* display in columns of 12 chars per item */
167
        availrows = screen_getheight();
214
        i = strlen(dta->fname);
-
 
215
        if (dta->attr & DOS_ATTR_DIR) {
-
 
216
          i += 2;
-
 
217
          output("[");
-
 
218
          output(dta->fname);
-
 
219
          output("]");
-
 
220
        } else {
-
 
221
          output(dta->fname);
-
 
222
        }
-
 
223
        while (i++ < WCOLWIDTH) output(" ");
-
 
224
        if (++wcolcount == wcols) {
-
 
225
          wcolcount = 0;
-
 
226
          outputnl("");
168
      }
227
        }
-
 
228
        break;
-
 
229
 
-
 
230
      case DIR_OUTPUT_BARE:
-
 
231
        outputnl(dta->fname);
-
 
232
        break;
169
    }
233
    }
-
 
234
 
-
 
235
    if ((flags & DIR_FLAG_PAUSE) && (--availrows < 2)) {
-
 
236
      press_any_key();
-
 
237
      availrows = screen_getheight();
170
  }
238
    }
-
 
239
 
-
 
240
  } while (findnext(dta) == 0);
-
 
241
 
-
 
242
  if (wcolcount != 0) outputnl("");
171
 
243
 
172
  return(-1);
244
  return(-1);
173
}
245
}