December 03, 2020, 08:11:04 PM

Author Topic: [bb] BB Data packing by _PJ_ [ 1+ years ago ]  (Read 497 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
[bb] BB Data packing by _PJ_ [ 1+ years ago ]
« on: June 29, 2017, 12:28:40 AM »
Title : BB Data packing
Author : _PJ_
Posted : 1+ years ago

Description : Based on other Archive entries, the packaging here entails conversion from file to bank then to an "Include-able" dependency for Blitz containing Data statements.

Functionality is improved as the packaging here is function based and allows for configurable parameters as well as informative return values.


Code :
Code: BlitzBasic
  1. ;Example
  2.  
  3. Test_Data=ReadFileData("C:WINDOWSMedia  ada.wav")
  4. If (Not(Test_Data)) Then RuntimeError "Data was not read."
  5. Pack_File=PackData(Test_Data,"Test Pack.bb","DataPack")
  6. ClearPackBank(Test_Data)
  7. If (Not(Pack_File)) Then RuntimeError "Data was not packed to file."
  8.  
  9. ;Copy and Uncomment from a new blitz file to test Unpacking
  10.  
  11. ;Include "Test Pack.bb"
  12. ;Restore DataPack
  13. ;If (Not(UnpackData("Unpacked Test.wav"))) Then RuntimeError "File was not unpacked"
  14. ;End
  15. ;Function UnpackData(fp_FilePath$)                                                                                                                                                                                                                                                                                      ;       Unpacks an included Data Package into a real file. User MUST use Restore command with the correct label before calling this
  16. ;       If (fp_FilePath$<>"")
  17. ;               Local d_ReadByte
  18. ;               Local n_ByteCount
  19. ;               Local h_FileHandle=WriteFile(fp_FilePath$)
  20. ;               Repeat
  21. ;                       Read d_ReadByte
  22. ;                       If (d_ReadByte<0) Then Exit
  23. ;                               n_ByteCount=n_ByteCount+1
  24. ;                       WriteByte(h_FileHandle,d_ReadByte)
  25. ;               Until KeyDown(True)
  26. ;               CloseFile h_FileHandle
  27. ;               If (Not(n_ByteCount)) Then DebugLog "No data written"
  28. ;               Return n_ByteCount
  29. ;       End If
  30. ;       DebugLog "Invalid Filename"
  31. ;       Return False
  32. ;End Function
  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. ; The Functions
  63. Function ReadFileData(fp_FilePath$)                                                                                                                                                                                                                                                                             ;       Reads a File to Memory Bank and returns the Bank
  64.         If(FileType(fp_FilePath$)=1)
  65.                 Local n_Size=FileSize(fp_FilePath$)
  66.                 If (n_Size)
  67.                         Local h_FileHandle=ReadFile(fp_FilePath$)
  68.                         If (h_FileHandle)
  69.                                 Local bb_Databank=CreateBank(n_Size)
  70.                                 If (bb_Databank)
  71.                                         Local n_IterBytes
  72.                                         Local d_Byte
  73.                                         For n_IterBytes=1 To n_Size
  74.                                                 d_Byte=ReadByte(h_FileHandle)
  75.                                                 PokeByte bb_Databank,n_IterBytes-1,d_Byte
  76.                                         Next
  77.                                         CloseFile h_FileHandle
  78.                                         Return bb_Databank
  79.                                 End If
  80.                         End If
  81.                 End If
  82.         End If
  83.         DebugLog "Error Reading File "+fp_FilePath$
  84.         Return False
  85. End Function                                   
  86.  
  87. Function PackData(bb_PackBank%, fp_WritePath$, s_DataLabel$)                                                                                                                                                                    ;       Writes the Bank to a .bb File
  88.         If (bb_PackBank)
  89.                 Local n_Size=BankSize(bb_PackBank)
  90.                 If (n_Size)
  91.                         If (s_DataLabel$="") Or (Not(GetLabelNameValid(s_DataLabel)))
  92.                                 DebugLog "Invalid Data Label Name"
  93.                                 Return False
  94.                         End If
  95.                         s_DataLabel$="."+s_DataLabel$
  96.                         Local h_FileHandle=WriteFile(fp_WritePath$)
  97.                         If (h_FileHandle)
  98.                                 WriteStringData(h_FileHandle,s_DataLabel$)
  99.                                 Local d_Byte
  100.                                 Local n_IterBytes
  101.                                 Local n_IterBlocks
  102.                                 Local n_OverFlow=n_Size Mod 16
  103.                                 Local n_EndBlock=((n_Size-n_OverFlow) Shr 4)
  104.                                 For n_IterBlocks=0 To n_EndBlock-1
  105.                                         WriteStringData(h_FileHandle,"Data ",True)
  106.                                         For n_IterBytes=0 To 15
  107.                                                 d_Byte=PeekByte(bb_PackBank,n_IterBytes+(n_IterBlocks Shl 4))
  108.                                                 WriteByteData(h_FileHandle,d_Byte)
  109.                                                 If (n_IterBytes<15) Then WriteStringData(h_FileHandle,",")
  110.                                         Next
  111.                                 Next
  112.                                 If (n_OverFlow)
  113.                                         WriteStringData(h_FileHandle,"Data ",True)
  114.                                         For n_IterBlocks=0 To n_OverFlow
  115.                                                 d_Byte=PeekByte(bb_PackBank, n_Size-(n_IterBlocks+1))
  116.                                                 WriteByteData(h_FileHandle,d_Byte)
  117.                                                 WriteStringData(h_FileHandle,",")
  118.                                         Next
  119.                                 End If
  120.                                 WriteByte  h_FileHandle,-1
  121.                                 CloseFile h_FileHandle
  122.                                 Return True
  123.                         End If
  124.                 End If
  125.         End If
  126.         DebugLog "Memory Bank Error"
  127.         Return False
  128. End Function
  129.  
  130. Function ClearPackBank(bb_PackBank%)                                                                                                                                                                                                                                                                    ;       Frees up the memory
  131.         If (bb_PackBank) Then FreeBank bb_PackBank
  132. End Function
  133.  
  134. Function UnpackData(fp_FilePath$)                                                                                                                                                                                                                                                                                       ;       Unpacks an included Data Package into a real file. User MUST use Restore command with the correct label before calling this
  135.         If (fp_FilePath$<>"")
  136.                 Local d_ReadByte
  137.                 Local n_ByteCount
  138.                 Local h_FileHandle=WriteFile(fp_FilePath$)
  139.                 Repeat
  140.                         Read d_ReadByte
  141.                         If (d_ReadByte<0) Then Exit
  142.                         n_ByteCount=n_ByteCount+1
  143.                         WriteByte(h_FileHandle,d_ReadByte)
  144.                 Until KeyDown(True)
  145.                 CloseFile h_FileHandle
  146.                 If (Not(n_ByteCount)) Then DebugLog "No data written"
  147.                 Return n_ByteCount
  148.         End If
  149.         DebugLog "Invalid Filename"
  150.         Return False
  151. End Function
  152.  
  153.  
  154.  
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161. ; The following are system functions to enable operation of the Packing/Unpacking. These are not for user calls.
  162.  
  163. Function WriteStringData(h_FileHandle%,s_String$,b_NewLine=False)                                                                                                                                               ;       Writes Strings as Byets to the pack file
  164.         If (b_NewLine)
  165.                 WriteByte h_FileHandle,13
  166.                 WriteByte h_FileHandle,10
  167.         End If
  168.         Local n_IterBytes
  169.         Local n_Length=Len(s_String$)
  170.         If (n_Length)
  171.                 For n_IterBytes=1 To n_Length
  172.                         WriteByte h_FileHandle,Asc(Mid(s_String$,n_IterBytes,1))
  173.                 Next
  174.         End If
  175. End Function
  176.  
  177. Function WriteByteData(h_FileHandle%,d_ByteData)                                                                                                                                                                                                                        ;       Writes Bytes to the pack file
  178.         Local n_IterDecimal
  179.         Local n_DecSize=Len(Str(d_ByteData))
  180.         If (d_ByteData)
  181.                 Local d_WriteByte
  182.                 For n_IterDecimal=n_DecSize-1 To 1 Step -1
  183.                         d_WriteByte=(Int(Floor(d_ByteData/(10^n_IterDecimal))) Mod 10^n_IterDecimal)
  184.                         WriteByteValue(h_FileHandle,d_WriteByte)
  185.                 Next
  186.                 WriteByteValue(h_FileHandle,(d_ByteData Mod 10))
  187.         Else
  188.                 WriteByteValue(h_FileHandle,0)
  189.         End If
  190. End Function
  191.  
  192. Function WriteByteValue(h_FileHandle%,n_Value)                                                                                                                                                                                                                          ;       Helps translate Byte values for writing
  193.         n_Value=n_Value+48
  194.         WriteByte h_FileHandle,n_Value
  195. End Function
  196.  
  197. Function GetLabelNameValid(s_String$)                                                                                                                                                                                                                                                                   ;       Used to ensure validity of the Blitz .Label
  198.         If (s_String$="") Then Return False
  199.         Local n_IterAsc
  200.         For n_IterAsc=0 To 47
  201.                 If Instr(s_String,Chr(n_IterAsc)) Then Return False
  202.         Next
  203.         For n_IterAsc=58 To 64
  204.                 If Instr(s_String,Chr(n_IterAsc)) Then Return False
  205.         Next
  206.         For n_IterAsc=91 To 94
  207.                 If Instr(s_String,Chr(n_IterAsc)) Then Return False
  208.         Next
  209.         If Instr(s_String,Chr(96)) Then Return False
  210.         For n_IterAsc=122 To 255
  211.                 If Instr(s_String,Chr(n_IterAsc)) Then Return False
  212.         Next           
  213.         Return True
  214. End Function


Comments :


_PJ_(Posted 1+ years ago)

 Added a fix, underscores are now viable in Data Label names.


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal