xrFName.mod 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. (* Copyright (c) 2000 Excelsior, Russia. All Rights Reserved. *)
  2. <*+ M2EXTENSIONS *>
  3. IMPLEMENTATION MODULE xrFName; (* paul 27-Jan-00 *)
  4. IMPORT env:=platform;
  5. (* similar to M2 ISO Strings.Extract *)
  6. PROCEDURE Extract(s: ARRAY OF CHAR; p,len: CARDINAL; VAR d: ARRAY OF CHAR);
  7. VAR i: CARDINAL;
  8. BEGIN
  9. i:=0;
  10. WHILE (len>0) & (i<=HIGH(d)) & (p<=HIGH(s)) & (s[p]#0C) DO
  11. d[i]:=s[p]; DEC(len); INC(i); INC(p)
  12. END;
  13. IF i<=HIGH(d) THEN d[i]:=0C END;
  14. END Extract;
  15. (*----------------------------------------------------------------*)
  16. PROCEDURE X2C_ParseFileName(s-: ARRAY OF CHAR; VAR f: Format);
  17. VAR len,i: CARDINAL;
  18. checkDrvSep: BOOLEAN;
  19. BEGIN
  20. f.ok:=FALSE;
  21. f.dirPos:=0; f.dirLen:=0;
  22. f.namePos:=0; f.nameLen:=0;
  23. f.extPos:=0; f.extLen:=0;
  24. len:=LENGTH(s);
  25. IF len = 0 THEN RETURN END;
  26. i:=len;
  27. checkDrvSep := env.pl_msdos OR env.pl_vms OR env.pl_amiga;
  28. REPEAT DEC(i)
  29. UNTIL (i=0) OR (s[i]=env.extSep) OR (s[i]=env.pathEnd)
  30. OR checkDrvSep & (s[i]=env.drvSep);
  31. IF s[i]=env.extSep THEN
  32. f.extPos:=i+1;
  33. f.extLen:=len-i-1;
  34. len:=i;
  35. END;
  36. WHILE (i>0) & (s[i]#env.pathEnd) & NOT( checkDrvSep & (s[i]=env.drvSep) )
  37. DO DEC(i) END;
  38. IF s[i]=env.pathEnd THEN
  39. f.namePos:=i+1;
  40. f.nameLen:=len-i-1;
  41. f.dirLen:=i;
  42. IF i=0 THEN
  43. f.dirLen:=1;
  44. ELSIF env.pl_vms OR env.pl_msdos & (i=2) & (s[1]=env.drvSep) THEN
  45. INC(f.dirLen)
  46. END;
  47. ELSIF checkDrvSep & (s[i]=env.drvSep) THEN
  48. IF env.pl_msdos & (i#1) THEN RETURN END;
  49. f.namePos:=i+1;
  50. f.nameLen:=len-i-1;
  51. f.dirLen:=i+1;
  52. ELSE
  53. f.nameLen:=len;
  54. END;
  55. f.ok:=(f.nameLen + f.extLen > 0);
  56. END X2C_ParseFileName;
  57. PROCEDURE X2C_SplitFileName (fname: ARRAY OF CHAR;
  58. VAR path,name,ext: ARRAY OF CHAR);
  59. VAR f: Format;
  60. BEGIN
  61. X2C_ParseFileName(fname, f);
  62. IF f.ok THEN
  63. Extract(fname, f.dirPos, f.dirLen, path);
  64. Extract(fname, f.namePos, f.nameLen, name);
  65. Extract(fname, f.extPos, f.extLen, ext);
  66. ELSE
  67. path[0]:=0C; name[0]:=0C; ext[0]:=0C;
  68. END;
  69. END X2C_SplitFileName;
  70. PROCEDURE X2C_ExtractPath(fname: ARRAY OF CHAR; VAR path: ARRAY OF CHAR);
  71. VAR f: Format;
  72. BEGIN
  73. X2C_ParseFileName(fname, f);
  74. IF f.ok THEN
  75. Extract(fname, f.dirPos, f.dirLen, path);
  76. ELSE
  77. path[0]:=0C;
  78. END;
  79. END X2C_ExtractPath;
  80. PROCEDURE X2C_ExtractBaseName(fname: ARRAY OF CHAR; VAR n: ARRAY OF CHAR);
  81. VAR f: Format;
  82. BEGIN
  83. X2C_ParseFileName(fname, f);
  84. IF f.ok THEN
  85. Extract(fname, f.namePos, f.nameLen, n);
  86. ELSE
  87. n[0]:=0C;
  88. END;
  89. END X2C_ExtractBaseName;
  90. PROCEDURE X2C_ExtractFileExt(fname: ARRAY OF CHAR; VAR ext: ARRAY OF CHAR);
  91. VAR f: Format;
  92. BEGIN
  93. X2C_ParseFileName(fname, f);
  94. IF f.ok THEN
  95. Extract(fname, f.extPos, f.extLen, ext);
  96. ELSE
  97. ext[0]:=0C;
  98. END;
  99. END X2C_ExtractFileExt;
  100. END xrFName.