Subversion Repositories eduke32

Rev

Rev 5059 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5059 Rev 5060
Line 691... Line 691...
691
static int32_t klseek_grp(int32_t handle, int32_t offset, int32_t whence);
691
static int32_t klseek_grp(int32_t handle, int32_t offset, int32_t whence);
692
static void kclose_grp(int32_t handle);
692
static void kclose_grp(int32_t handle);
693
693
694
int32_t initgroupfile(const char *filename)
694
int32_t initgroupfile(const char *filename)
695
{
695
{
696
    char buf[16];
696
    char buf[70];
697
697
698
    // translate all backslashes (0x5c) to forward slashes (0x2f)
698
    // translate all backslashes (0x5c) to forward slashes (0x2f)
699
    toupperlookup[0x5c] = 0x2f;
699
    toupperlookup[0x5c] = 0x2f;
700
700
701
    if (filename == NULL)
701
    if (filename == NULL)
Line 754... Line 754...
754
        }
754
        }
755
        gfileoffs[numgroupfiles][gnumfiles[numgroupfiles]] = j;
755
        gfileoffs[numgroupfiles][gnumfiles[numgroupfiles]] = j;
756
        numgroupfiles++;
756
        numgroupfiles++;
757
        return 0;
757
        return 0;
758
    }
758
    }
-
 
759
    klseek_grp(numgroupfiles, 0, BSEEK_SET);
-
 
760
-
 
761
    // check if SSI
-
 
762
    // this performs several checks because there is no "SSI" magic
-
 
763
    int32_t version;
-
 
764
    kread_grp(numgroupfiles, &version, 4);
-
 
765
    version = B_LITTLE32(version);
-
 
766
    while (version == 1 || version == 2) // if
-
 
767
    {
-
 
768
        char zerobuf[70];
-
 
769
        Bmemset(zerobuf, 0, 70);
-
 
770
-
 
771
        int32_t numfiles;
-
 
772
        kread_grp(numgroupfiles, &numfiles, 4);
-
 
773
        numfiles = B_LITTLE32(numfiles);
-
 
774
-
 
775
        uint8_t temp, temp2;
-
 
776
-
 
777
        // get the string length
-
 
778
        kread_grp(numgroupfiles, &temp, 1);
-
 
779
        if (temp > 31) // 32 bytes allocated for the string
-
 
780
            break;
-
 
781
        // seek to the end of the string
-
 
782
        klseek_grp(numgroupfiles, temp, BSEEK_CUR);
-
 
783
        // verify everything remaining is a null terminator
-
 
784
        temp = 32 - temp;
-
 
785
        kread_grp(numgroupfiles, buf, temp);
-
 
786
        if (Bmemcmp(buf, zerobuf, temp))
-
 
787
            break;
-
 
788
-
 
789
        if (version == 2)
-
 
790
        {
-
 
791
            // get the string length
-
 
792
            kread_grp(numgroupfiles, &temp, 1);
-
 
793
            if (temp > 11) // 12 bytes allocated for the string
-
 
794
                break;
-
 
795
            // seek to the end of the string
-
 
796
            klseek_grp(numgroupfiles, temp, BSEEK_CUR);
-
 
797
            // verify everything remaining is a null terminator
-
 
798
            temp = 12 - temp;
-
 
799
            kread_grp(numgroupfiles, buf, temp);
-
 
800
            if (Bmemcmp(buf, zerobuf, temp))
-
 
801
                break;
-
 
802
        }
-
 
803
-
 
804
        temp2 = 0;
-
 
805
        for (uint8_t i=0;i<3;i++)
-
 
806
        {
-
 
807
            // get the string length
-
 
808
            kread_grp(numgroupfiles, &temp, 1);
-
 
809
            if (temp > 70) // 70 bytes allocated for the string
-
 
810
            {
-
 
811
                temp2 = 1;
-
 
812
                break;
-
 
813
            }
-
 
814
            // seek to the end of the string
-
 
815
            klseek_grp(numgroupfiles, temp, BSEEK_CUR);
-
 
816
            // verify everything remaining is a null terminator
-
 
817
            temp = 70 - temp;
-
 
818
            if (temp == 0)
-
 
819
                continue;
-
 
820
            kread_grp(numgroupfiles, buf, temp);
-
 
821
            temp2 |= Bmemcmp(buf, zerobuf, temp);
-
 
822
        }
-
 
823
        if (temp2)
-
 
824
            break;
-
 
825
-
 
826
        // Passed all the tests: read data.
-
 
827
-
 
828
        gnumfiles[numgroupfiles] = numfiles;
-
 
829
-
 
830
        gfilelist[numgroupfiles] = (char *)Xmalloc(gnumfiles[numgroupfiles]<<4);
-
 
831
        gfileoffs[numgroupfiles] = (int32_t *)Xmalloc((gnumfiles[numgroupfiles]+1)<<2);
-
 
832
-
 
833
        int32_t j = (version == 2 ? 267 : 254) + (numfiles * 121), k;
-
 
834
        for (int32_t i = 0; i < numfiles; i++)
-
 
835
        {
-
 
836
            // get the string length
-
 
837
            kread_grp(numgroupfiles, &temp, 1);
-
 
838
            if (temp > 12)
-
 
839
                temp = 12;
-
 
840
            // read the file name
-
 
841
            kread_grp(numgroupfiles, &gfilelist[numgroupfiles][i<<4], temp);
-
 
842
            gfilelist[numgroupfiles][(i<<4)+temp] = 0;
-
 
843
-
 
844
            // skip to the end of the 12 bytes
-
 
845
            klseek_grp(numgroupfiles, 12-temp, BSEEK_CUR);
-
 
846
-
 
847
            // get the file size
-
 
848
            kread_grp(numgroupfiles, &k, 4);
-
 
849
            k = B_LITTLE32(k);
-
 
850
-
 
851
            // record the offset of the file in the SSI
-
 
852
            gfileoffs[numgroupfiles][i] = j;
-
 
853
            j += k;
-
 
854
-
 
855
            // skip unknown data
-
 
856
            klseek_grp(numgroupfiles, 104, BSEEK_CUR);
-
 
857
        }
-
 
858
        gfileoffs[numgroupfiles][gnumfiles[numgroupfiles]] = j;
-
 
859
        numgroupfiles++;
-
 
860
        return 0;
-
 
861
    }
759
862
760
    kclose_grp(numgroupfiles);
863
    kclose_grp(numgroupfiles);
761
    return -1;
864
    return -1;
762
}
865
}
763
866