resource.inc

Переключить прокрутку окна
Загрузить этот исходный код

;
  ; Реализация среды исполнения языка программирования
  ; Объектно-ориентированный продвинутый векторный транслятор
  ;
  ; Copyright © 2021, 2024 Малик Разработчик
  ;
  ; Это свободная программа: вы можете перераспространять ее и/или изменять
  ; ее на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
  ; в каком она была опубликована Фондом свободного программного обеспечения;
  ; либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
  ;
  ; Эта программа распространяется в надежде, что она будет полезной,
  ; но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
  ; или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
  ; общественной лицензии GNU.
  ;
  ; Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
  ; вместе с этой программой. Если это не так, см.
  ; <https://www.gnu.org/licenses/>.
;

; <fold типы ресурсов — можно использовать как возможное значение аргумента rsrcType>
                RT_ICON       =  3
                RT_GROUP_ICON = 14
                RT_VERSION    = 16
; </fold>

; <fold идентификаторы языков — можно использовать в сочетании с идентификатором разновидности языка как возможное значение аргумента lang>
                LANG_NEUTRAL    = $00
                LANG_BULGARIAN  = $02
                LANG_CHINESE    = $04
                LANG_CROATIAN   = $1a
                LANG_CZECH      = $05
                LANG_DANISH     = $06
                LANG_DUTCH      = $13
                LANG_ENGLISH    = $09
                LANG_FINNISH    = $0b
                LANG_FRENCH     = $0c
                LANG_GERMAN     = $07
                LANG_GREEK      = $08
                LANG_HUNGARIAN  = $0e
                LANG_ICELANDIC  = $0f
                LANG_ITALIAN    = $10
                LANG_JAPANESE   = $11
                LANG_KOREAN     = $12
                LANG_NORWEGIAN  = $14
                LANG_POLISH     = $15
                LANG_PORTUGUESE = $16
                LANG_ROMANIAN   = $18
                LANG_RUSSIAN    = $19
                LANG_SLOVAK     = $1b
                LANG_SLOVENIAN  = $24
                LANG_SPANISH    = $0a
                LANG_SWEDISH    = $1d
                LANG_THAI       = $1e
                LANG_TURKISH    = $1f
; </fold>

; <fold идентификаторы разновидностей языков — можно использовать в сочетании с идентификатором языка как возможное значение аргумента lang>
                SUBLANG_NEUTRAL              = $00 shl $0a
                SUBLANG_DEFAULT              = $01 shl $0a
                SUBLANG_SYS_DEFAULT          = $02 shl $0a
                SUBLANG_CHINESE_TRADITIONAL  = $01 shl $0a
                SUBLANG_CHINESE_SIMPLIFIED   = $02 shl $0a
                SUBLANG_CHINESE_HONGKONG     = $03 shl $0a
                SUBLANG_CHINESE_SINGAPORE    = $04 shl $0a
                SUBLANG_DUTCH                = $01 shl $0a
                SUBLANG_DUTCH_BELGIAN        = $02 shl $0a
                SUBLANG_ENGLISH_US           = $01 shl $0a
                SUBLANG_ENGLISH_UK           = $02 shl $0a
                SUBLANG_ENGLISH_AUS          = $03 shl $0a
                SUBLANG_ENGLISH_CAN          = $04 shl $0a
                SUBLANG_ENGLISH_NZ           = $05 shl $0a
                SUBLANG_ENGLISH_EIRE         = $06 shl $0a
                SUBLANG_FRENCH               = $01 shl $0a
                SUBLANG_FRENCH_BELGIAN       = $02 shl $0a
                SUBLANG_FRENCH_CANADIAN      = $03 shl $0a
                SUBLANG_FRENCH_SWISS         = $04 shl $0a
                SUBLANG_GERMAN               = $01 shl $0a
                SUBLANG_GERMAN_SWISS         = $02 shl $0a
                SUBLANG_GERMAN_AUSTRIAN      = $03 shl $0a
                SUBLANG_ITALIAN              = $01 shl $0a
                SUBLANG_ITALIAN_SWISS        = $02 shl $0a
                SUBLANG_NORWEGIAN_BOKMAL     = $01 shl $0a
                SUBLANG_NORWEGIAN_NYNORSK    = $02 shl $0a
                SUBLANG_PORTUGUESE           = $02 shl $0a
                SUBLANG_PORTUGUESE_BRAZILIAN = $01 shl $0a
                SUBLANG_SPANISH              = $01 shl $0a
                SUBLANG_SPANISH_MEXICAN      = $02 shl $0a
                SUBLANG_SPANISH_MODERN       = $03 shl $0a
; </fold>

; <fold макросы для вставки иконок в приложение — в соответствии со спецификацией формата исполняемого модуля>
    macro pedirectory rootLabel*, [rsrcType, subdirLabel] {
        common
                    local       max
                    local       count
                    max   = 0
                    count = 0
        forward
                    count = count+1
        if((rsrcType) > max)
                        max = rsrcType
        end if
        common
                    dd          $00000000
                    dd          %t
                    dd          $00000000
                    dd          count shl $10
        repeat(max)
        forward
            if((rsrcType) = %)
                            dd          rsrcType
                            dd          $80000000+(subdirLabel)-(rootLabel)
            end if
        common
        end repeat
    }

    macro peresource subdirLabel*, rootLabel*, [id, lang, contentLabel] {
        common
                    local       i
                    local       j
                    local       k
                    local       v1
                    local       v2
                    local       min
                    local       max
                    local       count
                    local       current
        forward
                    min = id
                    max = id
        common
                    count = 0
        forward
                    count = count+1
        if((id) < min)
                        min = id
        else if((id) > max)
                        max = id
        end if
        common
        subdirLabel:
                    dd          $00000000
                    dd          %t
                    dd          $00000000
                    dd          count shl $10
        repeat(max-min+1)
                        current = $
        forward
            if((id) = min+%-1 & current = $)
                            dd          id
                            dd          $80000000+(contentLabel#.dir)-(rootLabel)
            end if
        common
        end repeat
        repeat(max-min+1)
                        current = $
        forward
            if((id) = min+%-1)
                if(current = $)
                    contentLabel#.dir:
                                dd          $00000000
                                dd          %t
                                dd          $00000000
                                dd          $00010000
                                dd          lang
                                dd          (contentLabel)-(rootLabel)
                                count = 1
                else
                                dd          lang
                                dd          (contentLabel)-(rootLabel)
                                count = count+1
                end if
            end if
                        contentLabel#.resid = id
        common
            if(count > 1)
                            store       word count at current+$0e
                            i = count shr 1
                while(i > 0)
                                j = i
                    while(j < count)
                                    k = j
                        while(k-i >= 0)
                                        load        v1 dword from current+k*8+$10
                                        load        v2 dword from current+(k-i)*8+$10
                            if(v1 >= v2)
                                            break
                            end if
                                        store       dword v1 at current+(k-i)*8+$10
                                        store       dword v2 at current+k*8+$10
                                        load        v1 dword from current+k*8+$14
                                        load        v2 dword from current+(k-i)*8+$14
                                        store       dword v1 at current+(k-i)*8+$14
                                        store       dword v2 at current+k*8+$14
                                        k = k-i
                        end while
                                    j = j+1
                    end while
                                i = i shr 1
                end while
            end if
        end repeat
    }

    macro peicon groupLabel*, [contentLabel, fileRelaPath] {
        common
                    local       count
                    local       header
                    count = 0
        forward
                    local       content
                    local       size
                    local       position
        contentLabel:
                    dd          rva(content)
                    dd          size
                    dd          $00000000
                    dd          $00000000
        virtual at 0
                        file        fileRelaPath: $06, $10
                        load        size dword from $08
                        load        position dword from $0c
        end virtual
        content:    file        fileRelaPath: position, size
                    count = count+1
        common
                    align_d     $04
        groupLabel: dd          rva(header)
                    dd          count*$0e+$06
                    dd          $00000000
                    dd          $00000000
         header:    dw          $0000
                    dw          $0001
                    dw          count
        forward
                    file        fileRelaPath: $06, $0c
                    dw          contentLabel#.resid
        common
                    align_d     $04
    }
; </fold>

; <fold типы операционных систем — можно использовать как возможное значение аргумента fileOS>
                VOS_UNKNOWN       = $00000000
                VOS_DOS           = $00010000
                VOS_OS216         = $00020000
                VOS_OS232         = $00030000
                VOS_NT            = $00040000
                VOS__BASE         = $00000000
                VOS__WINDOWS16    = $00000001
                VOS__PM16         = $00000002
                VOS__PM32         = $00000003
                VOS__WINDOWS32    = $00000004
                VOS_DOS_WINDOWS16 = $00010001
                VOS_DOS_WINDOWS32 = $00010004
                VOS_OS216_PM16    = $00020002
                VOS_OS232_PM32    = $00030003
                VOS_NT_WINDOWS32  = $00040004
; </fold>

; <fold типы исполняемых файлов — можно использовать как возможное значение аргумента fileType>
                VFT_UNKNOWN    = $00000000
                VFT_APP        = $00000001
                VFT_DLL        = $00000002
                VFT_DRV        = $00000003
                VFT_FONT       = $00000004
                VFT_VXD        = $00000005
                VFT_STATIC_LIB = $00000007
; </fold>

; <fold подтипы исполняемых файлов — можно использовать как возможное значение аргумента fileSubtype>
                VFT2_UNKNOWN               = $00000000
                VFT2_DRV_PRINTER           = $00000001
                VFT2_DRV_KEYBOARD          = $00000002
                VFT2_DRV_LANGUAGE          = $00000003
                VFT2_DRV_DISPLAY           = $00000004
                VFT2_DRV_MOUSE             = $00000005
                VFT2_DRV_NETWORK           = $00000006
                VFT2_DRV_SYSTEM            = $00000007
                VFT2_DRV_INSTALLABLE       = $00000008
                VFT2_DRV_SOUND             = $00000009
                VFT2_DRV_COMM              = $0000000a
                VFT2_DRV_INPUTMETHOD       = $0000000b
                VFT2_DRV_VERSIONED_PRINTER = $0000000c
                VFT2_FONT_RASTER           = $00000001
                VFT2_FONT_VECTOR           = $00000002
                VFT2_FONT_TRUETYPE         = $00000003
; </fold>

; <fold управляющие сигналы консоли — можно использовать как возможное значение аргумента ctrl>
                CTRL_C_EVENT        = 0
                CTRL_BREAK_EVENT    = 1
                CTRL_CLOSE_EVENT    = 2
                CTRL_LOGOFF_EVENT   = 5
                CTRL_SHUTDOWN_EVENT = 6
; </fold>

; <fold макрос для вставки расширенной, с поддержкой уникода, информации о версии программного обеспечения — в соответствии со спецификацией формата исполняемого модуля>
    macro peverinfoex contentLabel, fileOS, fileType, fileSubtype, lang, ctrl, [namevalue] {
        common
                    local       vidata
                    local       visize
                    local       invalue
                    local       insize
                    local       version
                    local       count
                    local       shift
                    local       char
                    local       filever
                    local       prodver
                    local       isname
                    local       isfilever
                    local       isprodver
                    local       lvsdata
                    local       lvldata
                    local       sfidata
                    local       sfisize
                    local       strdata
                    local       strsize
                    local       vfidata
                    local       vfisize
                    local       vardata
                    local       varsize
        contentLabel:
                    dd          rva(vidata)
                    dd          visize
                    dd          $00000000
                    dd          $00000000
         vidata:    dw          visize
                    dw          insize
                    dw          $0000
                    du          "VS_VERSION_INFO"
                    du          $0000
                    du          $0000
        invalue:    dd          $feef04bd
                    dd          $00010000
                    filever = 0
                    prodver = 0
                    isname  = 0
        forward
                    local       vsdata
                    local       vldata
        if(~(namevalue eq))
            if(namevalue eqtype 0)
                            isname = 0
            else if(namevalue eqtype "")
                            isname = isname xor 1
            end if
            if(isname)
                if(namevalue eq "FileVersion")
                                isfilever = 1
                                isprodver = 0
                else if(namevalue eq "ProductVersion")
                                isfilever = 0
                                isprodver = 1
                else
                                isfilever = 0
                                isprodver = 0
                end if
            else
                if(isfilever | isprodver)
                    virtual at 0
                                    db          namevalue
                                    count   = $
                                    version = $00
                                    shift   = $10
                        repeat(count)
                                        load        char from %-1
                            if(char = '.')
                                if(shift mod $20 <> 0)
                                                shift = shift-$10
                                else
                                                shift = shift+$30
                                end if
                            else
                                            version = (version and not($ffff shl shift)) or ((version shr shift and $ffff)*$0a+char-'0') shl shift
                            end if
                        end repeat
                    end virtual
                    if(isfilever)
                                    filever = version
                    end if
                    if(isprodver)
                                    prodver = version
                    end if
                end if
                            isfilever = 0
                            isprodver = 0
            end if
        end if
        common
                    dq          filever
                    dq          prodver
                    dd          $00000000
                    dd          $00000000
                    dd          fileOS
                    dd          fileType
                    dd          fileSubtype
                    dd          $00000000
                    dd          $00000000
                    insize = $-invalue
        sfidata:    dd          sfisize
                    du          $0001
                    du          "StringFileInfo"
                    du          $0000
        strdata:    dd          strsize
                    du          $0001
                    du          "040904E4"
                    du          $0000
                    count  = 0
                    isname = 0
        forward
        if(~(namevalue eq))
            if(namevalue eqtype 0)
                            isname = 0
            else if(namevalue eqtype "")
                            isname = isname xor 1
            end if
            if(isname)
                if(count > 0)
                                dw          $0000
                                store       word $-lvsdata at lvsdata+$00
                                store       word ($-lvldata)/2 at lvsdata+$02
                end if
                            align_d     $04
                 vsdata:    dw          $0000
                            dw          $0000
                            du          $0001
                            du          namevalue
                            du          $0000
                            align_d     $04
                 vldata:    lvsdata = vsdata
                            lvldata = vldata
                            count   = 1
            else
                if(namevalue eqtype 0)
                                dw          namevalue
                else if(namevalue eqtype "")
                                du          namevalue
                end if
            end if
        end if
        common
        if(count > 0)
                        dw          $0000
                        store       word $-lvsdata at lvsdata+$00
                        store       word ($-lvldata)/2 at lvsdata+$02
        end if
                    align_d     $04
                    strsize = $-strdata
                    sfisize = $-sfidata
        vfidata:    dd          vfisize
                    du          $0001
                    du          "VarFileInfo"
                    du          $0000
                    du          $0000
        vardata:    dw          varsize
                    dw          $0004
                    du          $0000
                    du          "Translation"
                    du          $0000
                    du          $0000
                    dw          lang
                    dw          ctrl
                    varsize = $-vardata
                    vfisize = $-vfidata
                    visize  = $-vidata
    }
; </fold>