home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / MISC / VTZONE10.ZIP / VTZONE.BAS < prev    next >
BASIC Source File  |  2004-12-07  |  8KB  |  352 lines

  1. ' VTzone v1.0
  2. ' This utility will update VConfig's timezone setting automatically when
  3. ' ran each night.
  4.  
  5. DECLARE SUB UpdateTZ (ntz$)
  6. DECLARE SUB CmdError ()
  7. DECLARE FUNCTION Easter$ (y%)
  8. DECLARE FUNCTION DaysOfWeek$ (d%)
  9. DECLARE FUNCTION DaysOfMonth% (m%, y%)
  10. DECLARE FUNCTION LD% (dw%, m%, y%)
  11. DECLARE FUNCTION OD% (o%, dw%, m%, y%)
  12. DECLARE FUNCTION DOW% (d%, m%, y%)
  13. DECLARE FUNCTION TRIM$ (text$)
  14.  
  15. DEFINT A-Z
  16.  
  17. '$INCLUDE: 'VADVCFG.BAS'
  18.  
  19. PRINT
  20. PRINT "VTZone v1.0"
  21. PRINT "(c) Aspect Technologies"
  22. PRINT "-----------------------"
  23. PRINT
  24.  
  25.  
  26. ' Check configuration.
  27. OPEN "MAIN.CFG" FOR RANDOM ACCESS READ SHARED AS #1
  28. IF LOF(1) = 0 THEN
  29.     PRINT "MAIN.CFG is missing."
  30.     PRINT
  31.     CLOSE #1
  32.     KILL "MAIN.CFG"
  33.     END
  34. END IF
  35. CLOSE #1
  36.  
  37.  
  38. ' Command line defaults.
  39. tz = -6
  40. sm = 4
  41. si$ = "10"
  42. em = 10
  43. ei$ = "L0"
  44. sc$ = ""
  45. ec$ = ""
  46.  
  47.  
  48. ' Parse the command line.
  49. cmd$ = TRIM$(UCASE$(COMMAND$))
  50. IF (cmd$ = "") THEN CmdError
  51.  
  52. DIM opt$(1 TO 14)
  53.  
  54. FOR I = 1 TO 14
  55.     p = INSTR(cmd$, " ")
  56.     IF (p = 0) THEN
  57.         opt$(I) = cmd$
  58.         EXIT FOR
  59.     END IF
  60.     opt$(I) = TRIM$(LEFT$(cmd$, p - 1))
  61.     cmd$ = TRIM$(MID$(cmd$, p + 1))
  62. NEXT I
  63.  
  64. FOR I = 1 TO 14 STEP 2
  65.     SELECT CASE opt$(I)
  66.         CASE "-TZ"
  67.             tz = VAL(opt$(I + 1))
  68.         CASE "-SM"
  69.             sm = VAL(opt$(I + 1))
  70.         CASE "-SI"
  71.             si$ = opt$(I + 1)
  72.         CASE "-EM"
  73.             em = VAL(opt$(I + 1))
  74.         CASE "-EI"
  75.             ei$ = opt$(I + 1)
  76.         CASE "-SC"
  77.             sc$ = opt$(I + 1)
  78.         CASE "-EC"
  79.             ec$ = opt$(I + 1)
  80.     END SELECT
  81. NEXT I
  82.  
  83.  
  84. ' Get today's date information.
  85. month = VAL(LEFT$(DATE$, 2))
  86. day = VAL(MID$(DATE$, 4, 2))
  87. year = VAL(RIGHT$(DATE$, 4))
  88.  
  89.  
  90. ' Break down variables.
  91. so$ = LEFT$(si$, 1)
  92. sdw = VAL(RIGHT$(si$, 1))
  93. eo$ = LEFT$(ei$, 1)
  94. edw = VAL(RIGHT$(ei$, 1))
  95.  
  96.  
  97. ' DST Begins
  98. IF (so$ = "L") THEN
  99.     dstsday = LD(sdw, sm, year)
  100. ELSE
  101.     dstsday = OD(VAL(so$), sdw, sm, year)
  102. END IF
  103. IF (sm < 10) THEN
  104.     sm$ = "0" + TRIM$(STR$(sm))
  105. ELSE
  106.     sm$ = STR$(sm)
  107. END IF
  108. IF (dstsday < 10) THEN
  109.     dstsday$ = "0" + TRIM$(STR$(dstsday))
  110. ELSE
  111.     dstsday$ = STR$(dstsday)
  112. END IF
  113. dststart$ = sm$ + "-" + dstsday$ + "-" + TRIM$(STR$(year))
  114.  
  115.  
  116. ' DST Ends
  117. IF (eo$ = "L") THEN
  118.     dsteday = LD(edw, em, year)
  119. ELSE
  120.     dsteday = OD(VAL(eo$), edw, em, year)
  121. END IF
  122. IF (em < 10) THEN
  123.     em$ = "0" + TRIM$(STR$(em))
  124. ELSE
  125.     em$ = TRIM$(STR$(em))
  126. END IF
  127. IF (dsteday < 10) THEN
  128.     dsteday$ = "0" + TRIM$(STR$(dsteday))
  129. ELSE
  130.     dsteday$ = TRIM$(STR$(dsteday))
  131. END IF
  132. dstend$ = em$ + "-" + dsteday$ + "-" + TRIM$(STR$(year))
  133.  
  134.  
  135. ' Format the timezone.
  136. t = tz
  137. IF (tz < 0) THEN t = t - (t * 2)
  138. IF (t < 100) THEN t = t * 100
  139. IF (tz < 0) THEN
  140.     tz = t - (t * 2)
  141. ELSE
  142.     tz = t
  143. END IF
  144.  
  145.  
  146. ' Compare to today.
  147. IF (dststart$ = DATE$) THEN
  148.     t$ = TRIM$(STR$(tz + 100))
  149.     IF (tz < 0) THEN
  150.         IF (LEN(t$) < 5) THEN
  151.             t$ = "-0" + RIGHT$(t$, 3)
  152.         END IF
  153.     ELSE
  154.         IF (LEN(t$) < 4) THEN
  155.             t$ = "+0" + RIGHT$(t$, 3)
  156.         ELSE
  157.             t$ = "+" + t$
  158.         END IF
  159.     END IF
  160.     ntz$ = sc$ + " (" + t$ + ")"
  161.     UpdateTZ (ntz$)
  162.     PRINT "Timezone updated!"
  163. ELSEIF (dstend$ = DATE$) THEN
  164.     t$ = TRIM$(STR$(tz))
  165.     IF (tz < 0) THEN
  166.         IF (LEN(t$) < 5) THEN
  167.             t$ = "-0" + RIGHT$(t$, 3)
  168.         END IF
  169.     ELSE
  170.         IF (LEN(t$) < 4) THEN
  171.             t$ = "+0" + RIGHT$(t$, 3)
  172.         ELSE
  173.             t$ = "+" + t$
  174.         END IF
  175.     END IF
  176.  
  177.     ntz$ = ec$ + " (" + t$ + ")"
  178.     UpdateTZ (ntz$)
  179.     PRINT "Timezone updated!"
  180. ELSE
  181.     PRINT "No update today!"
  182. END IF
  183.  
  184. SUB CmdError
  185.     PRINT "Command line error."
  186.     PRINT "VTZONE.EXE -tz TIMEZONE [options]"
  187.     PRINT
  188.     PRINT "Options:"
  189.     PRINT "  -tz  Specify your timezone relation to GMT (Required)"
  190.     PRINT "  -sm  Month DST begins (01-12)"
  191.     PRINT "  -si  Date identifier DST begins (see below)"
  192.     PRINT "  -em  Month DST ends (01-12)"
  193.     PRINT "  -ei  Date identifier DST ends (see below)"
  194.     PRINT "  -sc  Custom VADV field when DST begins"
  195.     PRINT "  -ec  Custom VADV field when DST ends"
  196.     PRINT
  197.     PRINT "Date Identifier:"
  198.     PRINT "  The identifier is made of two characters in the format 'xd'."
  199.     PRINT "  x - The relation of the date to the month (first, second, etc)"
  200.     PRINT "  d - The day of the week"
  201.     PRINT "Valid entries for x are:"
  202.     PRINT "  1 - First, 2 - Second, 3 - Third, 4 - Fourth, 5 - Fifth, L - Last"
  203.     PRINT "Valid entries for d are:"
  204.     PRINT "  0 - Sunday, 1 - Monday, 2 - Tuesday, 3 - Wednesday, 4 - Thursday,"
  205.     PRINT "  5 - Friday, 6 - Saturday"
  206.     PRINT
  207.     PRINT "Examples:"
  208.     PRINT "Central Standard Time example..."
  209.     PRINT "VTZONE.EXE -tz -6 -sc CDT -ec CST"
  210.     PRINT "Central European Time example..."
  211.     PRINT "VTZONE.EXE -tz +1 -sm 3 -si L0 -em 10 -ei L0 -sc CET -ec CEST"
  212.     PRINT
  213.     END
  214. END SUB
  215.  
  216. FUNCTION DaysOfMonth% (m%, y%)
  217.     SELECT CASE m%
  218.         CASE 1
  219.             DaysOfMonth = 31
  220.         CASE 2
  221.             l7 = y% MOD 4
  222.             l8 = y% MOD 100
  223.             l9 = y% MOD 400
  224.             IF l7 <> 0 THEN
  225.                 DaysOfMonth = 28
  226.             ELSEIF l8 <> 0 THEN
  227.                 DaysOfMonth = 29
  228.             ELSEIF l9 = 0 THEN
  229.                 DaysOfMonth = 29
  230.             ELSE
  231.                 DaysOfMonth = 28
  232.             END IF
  233.         CASE 3
  234.             DaysOfMonth = 31
  235.         CASE 4
  236.             DaysOfMonth = 30
  237.         CASE 5
  238.             DaysOfMonth = 31
  239.         CASE 6
  240.             DaysOfMonth = 30
  241.         CASE 7
  242.             DaysOfMonth = 31
  243.         CASE 8
  244.             DaysOfMonth = 31
  245.         CASE 9
  246.             DaysOfMonth = 30
  247.         CASE 10
  248.             DaysOfMonth = 31
  249.         CASE 11
  250.             DaysOfMonth = 30
  251.         CASE 12
  252.             DaysOfMonth = 31
  253.     END SELECT
  254. END FUNCTION
  255.  
  256. FUNCTION DaysOfWeek$ (d%)
  257.     SELECT CASE d%
  258.         CASE 1
  259.             DaysOfWeek = "Monday"
  260.         CASE 2
  261.             DaysOfWeek = "Tuesday"
  262.         CASE 3
  263.             DaysOfWeek = "Wednesday"
  264.         CASE 4
  265.             DaysOfWeek = "Thursday"
  266.         CASE 5
  267.             DaysOfWeek = "Friday"
  268.         CASE 6
  269.             DaysOfWeek = "Saturday"
  270.         CASE ELSE
  271.             DaysOfWeek = "Sunday"
  272.     END SELECT
  273. END FUNCTION
  274.  
  275. FUNCTION DOW% (d%, m%, y%)
  276.     e0 = (14 - m%) \ 12
  277.     e1 = y% - e0
  278.     e2 = 12 * e0 + m% - 2
  279.     e3 = e1 \ 4
  280.     e4 = e1 \ 100
  281.     e5 = e1 \ 400
  282.     e6 = (31 * e2) \ 12
  283.     e0 = d% + e1 + e3 - e4 + e5 + e6
  284.     DOW = e0 MOD 7
  285. END FUNCTION
  286.  
  287. FUNCTION Easter$ (y%)
  288.     i0 = y% \ 100
  289.     i1 = (y% \ 19) * -19 + y%
  290.     i2 = (i0 - 17) \ 25
  291.         i4 = i0 \ 4
  292.         i5 = (i0 - i2) \ 3
  293.         i6 = i0 - i4 - i5
  294.     i3 = (19 * i1) + 15 + i6
  295.     i4 = (i3 \ 30) * -30 + i3
  296.         i6 = i4 \ 28
  297.         i7 = i4 + 1
  298.         i8 = 29 \ i7
  299.         i9 = (21 - i1) \ 11
  300.         j0 = i6 * i8 * i9
  301.         j1 = (1 - j0) * i6
  302.     i5 = i4 - j1
  303.         i7 = y% \ 4
  304.         i8 = i0 \ 4
  305.     i6 = y! + i7 + i5 + 2 - i0 + i8
  306.     i7 = (i6 \ 7) * -7 + i6
  307.     i8 = i5 - i7
  308.     j0 = (i8 + 40) \ 44 + 3
  309.     j1 = (j0 \ 4) * -31 + 28 + i8
  310.     Easter = STR$(j0) + STR$(j1)
  311. END FUNCTION
  312.  
  313. FUNCTION LD% (dw%, m%, y%)
  314.     f0 = DaysOfMonth(m%, y%)
  315.     e0 = DOW(f0%, m%, y%)
  316.     i1 = e0 - dw%
  317.     IF (i1 < 0) THEN
  318.         i1 = i1 + 7
  319.     END IF
  320.     i1 = i1 MOD 7
  321.     LD = f0 - i1
  322. END FUNCTION
  323.  
  324. FUNCTION OD% (o%, dw%, m%, y%)
  325.     e0 = DOW(1, m%, y%)
  326.     i1 = dw% - e0
  327.     IF (i1 < 0) THEN
  328.         i1 = i1 + 7
  329.     END IF
  330.     i1 = i1 MOD 7
  331.     OD = 7 * o% - 6 + i1
  332. END FUNCTION
  333.  
  334. FUNCTION TRIM$ (text$)
  335.     TRIM$ = RTRIM$(LTRIM$(text$))
  336. END FUNCTION
  337.  
  338. SUB UpdateTZ (ntz$)
  339. ' Update the main.cfg file with the new timezone info.
  340.     DIM cfgMain AS cfgMain
  341.  
  342.     OPEN "MAIN.CFG" FOR RANDOM ACCESS READ WRITE SHARED AS #1 LEN = LEN(cfgMain)
  343.     IF (LEN(ntz$) > 12) THEN
  344.         ntz$ = LEFT$(ntz$, 12)
  345.     END IF
  346.     GET #1, 1, cfgMain
  347.     cfgMain.timezone = TRIM$(ntz$)
  348.     PUT #1, 1, cfgMain
  349.     CLOSE #1
  350. END SUB
  351.  
  352.