dirlist.c
上传用户:xiaoan1112
上传日期:2013-04-11
资源大小:19621k
文件大小:8k
源码类别:

操作系统开发

开发平台:

Visual C++

  1. /*
  2. COW : Character Oriented Windows
  3. (COW USER DIALOG)
  4. dirlist.c : Directory dir list control
  5. */
  6. #define COW
  7. #include <cow.h>
  8. #ifdef LISTBOX_DIR /* entire file */
  9. #define DIRLIST
  10. #include <udialog.h>
  11. #include <uevent.h>
  12. #include <uwindow.h>
  13. #include <uutil.h>
  14. #include "dialog.h"
  15. #include "event.h"
  16. #include "listbox.h"
  17. #include "window.h"
  18. #include "util.h"
  19. #include "dirlist.h"
  20. #include "_dirlist.h"
  21. #ifdef LISTBOX_LIMIT_SIZE
  22. #define cchDirMax 80 /* 64 + file name */
  23. #else
  24. #define cchDirMax 256
  25. #endif
  26. BOOL FAR PASCAL FBuildDirectoryList(PWND, char *, PWND, BOOL, char *);
  27. /* forward */
  28. STATIC BOOL FCorrectDriveDir(char *);
  29. STATIC char *SzChopText(PWND, char *);
  30. char szWildAll[] = "*.*";
  31. PRIVATE VOID FARPRIVATE
  32. DlgDirList(pwndListBox, szPath, pwndStatic, fDisplay, pwndListBox2)
  33. /*
  34.   -- construct a directory listing in the listbox.
  35.   -- return TRUE if the supplied path could be parsed
  36.   -- NOTE : do not change current directory unless redrawing
  37. (kludgy way to detect startup case)
  38.   -- NOTE : if pwndListBox == NULL, then don't fill
  39. */
  40. REGISTER PWND pwndListBox; /* listbox window */
  41. char *szPath; /* path */
  42. PWND pwndStatic; /* static item for tracking text or NULL */
  43. BOOL fDisplay;
  44. REGISTER PWND pwndListBox2; /* extra window for drives / dir */
  45. {
  46. char szDir[cchDirMax]; /* buffer for drive names */
  47. /* fill in listbox */
  48. Assert(pwndListBox != NULL || pwndListBox2 != NULL);
  49. if (pwndListBox2 == NULL)
  50. pwndListBox2 = pwndListBox;
  51. if (!FBuildDirectoryList(pwndListBox, szPath, pwndListBox2, fDisplay,
  52. szDir))
  53. return; /* illegal directory */
  54. if (fDisplay)
  55. {
  56. if (pwndListBox != NULL)
  57. DrawWindow(pwndListBox);
  58. if (pwndListBox2 != pwndListBox && pwndListBox2 != NULL)
  59. DrawWindow(pwndListBox2);
  60. }
  61. if (pwndStatic != NULL)
  62. {
  63. /* fill in static text item */
  64. GetCurDir(GetCurDrive(), szDir);
  65. SetDlgItemText(pwndStatic, SzChopText(pwndStatic, szDir),
  66.     fDisplay);
  67. }
  68. }
  69. VOID FAR PASCAL
  70. SetCurrentPath(szPath)
  71. /*
  72.   -- use path to set current drive / directory
  73.   -- NOTE : does not modify szPath
  74. */
  75. REGISTER char *szPath;
  76. {
  77. char * szTop = szPath;
  78. REGISTER char * pch;
  79. REGISTER char * pchDelim = NULL; /* after last delimiter */
  80. while (szPath[0] == ' ')
  81. szPath++;
  82. if (szPath[1] == ':')
  83. {
  84. /* drive prefix */
  85. if (!FValidDrive(szPath[0]))
  86. return; /* invalid drive */
  87. SetCurDrive(szPath[0]);
  88. szPath += 2;
  89. }
  90. /* copy path to buffer, record position of last delimiter */
  91. for (pch = szPath; *pch != ''; pch++)
  92. {
  93. if (*pch == '/' || *pch == '\')
  94. pchDelim = pch+1; /* point past delim */
  95. }
  96. if (pchDelim != NULL)
  97. {
  98. /* we have a prefixing drive or directory */
  99. char chSave;
  100. if (pchDelim != szPath+1)
  101. pchDelim--; /* lose last slash */
  102. chSave = *pchDelim; /* save old */
  103. *pchDelim = ''; /* truncate to directory */
  104. FSetCurDir(szPath);
  105. *pchDelim = chSave; /* restore string */
  106. }
  107. }
  108. char * FAR PASCAL
  109. SzDirSpec(szPath, szDir, pfRoot)
  110. /*
  111.   -- fill szDir with the path of the directory defined by szPath
  112.   -- return NULL if bogus directory (invalid drive)
  113.   -- otherwise return address of filename (inside szPath buffer).
  114.   -- set *pfRoot if
  115. (1) the path is just a root directory (eg. "x:").
  116. (2) the path is a root directory followed by a wildcard
  117. */
  118. REGISTER char *szPath;
  119. REGISTER char *szDir;
  120. BOOL * pfRoot; /* set if directory is root */
  121. {
  122. char *szSlash = szDir;
  123. BOOL fSlash = FALSE; /* => found a slash separator */
  124. BOOL fWild = FALSE; /* => found a wild card */
  125. *pfRoot = FALSE;
  126. while (*szPath != '')
  127. {
  128. switch (*szDir++ = *szPath++)
  129. {
  130. case '?':
  131. case '*':
  132. fWild = TRUE;
  133. /*fall through*/
  134. default:
  135. *pfRoot = FALSE;
  136. break;
  137. case ':':
  138. if (!FValidDrive(*(szPath-2)))
  139. return NULL;
  140. *pfRoot = TRUE; /* we are at the root */
  141. goto normal_delim;
  142. case '\':
  143. case '/':
  144. fSlash = TRUE;
  145. normal_delim:
  146. szSlash = szDir;
  147. break;
  148. }
  149. }
  150. if (!fSlash && fWild)
  151. {
  152. /* no slashes and wildcards, probably root-like */
  153. *pfRoot = TRUE;
  154. }
  155. strcpy(szSlash, szWildAll);
  156. return (szPath + (szSlash - szDir));
  157. }
  158. VOID FAR PASCAL
  159. MakeDirName(sz, szDir)
  160. REGISTER char *sz, *szDir;
  161. {
  162. char ch;
  163. *szDir = '[';
  164. szDir++;
  165. for (; (ch = *sz) != ''; sz++, szDir++)
  166. *szDir = ch;
  167. *szDir++ = ']';
  168. *szDir = '';
  169. }
  170. PRIVATE BOOL FARPRIVATE
  171. DlgDirSelect(pwndListBox, sz, pwndListBox2)
  172. /*
  173.   -- copy the selected file name to the specified buffer
  174.   -- strip out directory punctuation
  175.   -- return TRUE if a drive / directory only
  176. */
  177. PWND pwndListBox;
  178. REGISTER char *sz;
  179. PWND pwndListBox2;
  180. {
  181. Assert((pwndListBox->style & WS_TYPE) == WS_LISTBOX);
  182. if (pwndListBox2 != NULL)
  183. {
  184. /* ListBox2 => directory / drive */
  185. WORD cch;
  186. BOOL fDrive;
  187. Assert((pwndListBox2->style & WS_TYPE) == WS_LISTBOX);
  188. GetDlgItemText(pwndListBox2, sz, cchDirMax);
  189. fDrive = FCorrectDriveDir(sz);
  190. sz += (cch = strlen(sz));
  191. if (!fDrive && cch != 0)
  192. {
  193. /* no drive & text => prefix directory */
  194. *sz++ = '\';
  195. cch--;
  196. }
  197. GetDlgItemText(pwndListBox, sz, cchDirMax - cch);
  198. if (strlen(sz) == 0)
  199. return (TRUE); /* if no file name */
  200. }
  201. else
  202. {
  203. GetDlgItemText(pwndListBox, sz, cchDirMax);
  204. if (FCorrectDriveDir(sz))
  205. return(TRUE);
  206. }
  207. while( (*sz != '.') && (*sz != ''))
  208. sz++;
  209. if (*sz == '')
  210. {
  211. *sz = '.';
  212. *(sz+1) = '';
  213. }
  214. return(FALSE);
  215. }
  216. STATIC BOOL
  217. FCorrectDriveDir(sz)
  218. /*
  219.   -- correct file name if *sz contains a drive or directory
  220.   -- return TRUE if it contained a drive / directory
  221. */
  222. REGISTER char *sz;
  223. {
  224. REGISTER char *szNext = sz;
  225. if (*szNext++ != '[')
  226. return FALSE; /* no drive / dir */
  227. if (*szNext == '-')
  228. {
  229. /* it is a drive */
  230. *sz++ = szNext[1];
  231. *sz++ = ':';
  232. }
  233. else
  234. {
  235. while (*szNext != ']' && *szNext != '')
  236. *sz++ = *szNext++;
  237. *sz++ = '\';
  238. }
  239. *sz = '';
  240. return TRUE;
  241. }
  242. STATIC char *
  243. SzChopText(pwnd, szDir)
  244. /*
  245.   -- adjust Directory text "szDir" to fit in window pwnd
  246.   -- munges "szDir"
  247. */
  248. REGISTER PWND pwnd;
  249. REGISTER char * szDir;
  250. {
  251. WORD cchField;
  252. BOOL fChop = FALSE;
  253. WORD cch;
  254. RRC rrc;
  255. char chDrive;
  256. /* Get length of static field */
  257. GetClientRrc(pwnd,&rrc);
  258. cchField = rrc.rxRight - rrc.rxLeft;
  259. /* Chop characters off front end of text until short enough */
  260. while (cchField < (cch = strlen(szDir)))
  261. {
  262. if (!fChop)
  263. {
  264. chDrive = *szDir;
  265. if (cchField <= 7)
  266. break;
  267. cchField -= 7;
  268. szDir += 7;
  269. }
  270. while (cch-- > 0 && *szDir++ != '\')
  271. ;
  272. fChop = TRUE;
  273. }
  274. /* if any characters chopped off, replace first three characters in
  275.    remaining text string with elipsis */
  276. if (fChop)
  277. {
  278. szDir--;
  279. *--szDir = '.';
  280. *--szDir = '.';
  281. *--szDir = '.';
  282. *--szDir = '\';
  283. *--szDir = ':';
  284. *--szDir = chDrive;
  285. }
  286. return (szDir);
  287. }
  288. BOOL FARPRIVATE
  289. FMaybeDir(szPath)
  290. /*
  291.   -- return TRUE if "sz" might represent a directory
  292. */
  293. char * szPath;
  294. {
  295. REGISTER char * sz = szPath;
  296. REGISTER char ch;
  297. BOOL fAllWhite = TRUE;
  298. WORD atr;
  299. while ((ch = *sz) != '')
  300. {
  301. if (ch == ':' && !FValidDrive(*(sz-1)))
  302. return TRUE; /* bogus drive : keep listbox up */
  303. if (ch == '*' || ch == '?')
  304. return TRUE;
  305. else if (ch != ' ')
  306. fAllWhite = FALSE;
  307. sz++;
  308. }
  309. /* leave with sz => terminating '' */
  310. if (fAllWhite)
  311. return TRUE; /* all white => stay here */
  312. if (*(--sz) == ':')
  313. return TRUE; /* probably a drive */
  314. if ((*sz == '.') && (*(sz-1) == '.'))
  315. { /* probably a directory */
  316. *(++sz) = '\'; /* make it look like one */
  317. *(++sz) = '';
  318. return TRUE;
  319. }
  320. /* if ending '' or '/' at end of path - remove for test */
  321. if (*sz == '\' || *sz == '/')
  322. {
  323. if ((*(sz-1) == '.') && (*(sz-2) == '.'))
  324. return TRUE; /* probably a directory */
  325. if (*(sz-1) == ':') /* drive: case */
  326. return TRUE;
  327. *sz-- = '';
  328. }
  329. /* sz points to the last character in the string */
  330. /* check to see if it is a real directory */
  331. if ((atr = AtrOfPath(szPath)) != atrError &&
  332.     (atr & atrDir) != 0)
  333. {
  334. /* it is a real directory */
  335. *(++sz) = '\'; /* make it look like one */
  336. *(++sz) = '';
  337. return TRUE;
  338. }
  339. return FALSE; /* probably not a directory */
  340. }
  341. #endif /*LISTBOX_DIR*/