Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifndef unicode
- #define unicode
- #endif
- #include once "windows.bi"
- ' Для разбиения параметров программы по пробелам
- #include once "win\shellapi.bi"
- ' Строка с цифрами
- Const DigitsString = "0123456789"
- Const DigitsStringLength As Integer = 10
- ' Строка с буквами
- Const CharsString = "abc"
- Const CharsStringLength As Integer = 3
- ' Символы новой строки
- Const NewLine = !"\r\n"
- Const NewLineLength As Integer = 2
- ' Количество параметров не устраивает
- Const ErrorParams = !"Использование: v-vars.exe строка\r\n"
- ' Неудачное выделение памяти
- Const HeapAllocError = !"Система не может выделить память\r\n"
- ' Неудачное создание кучи
- Const HeapCreateError = !"Не могу создать кучу памяти\r\n"
- ' Главная функция
- Declare Function EntryPoint Alias "EntryPoint"()As Integer
- ' Получение количества листьев на последнем уровне
- Declare Function GetListCount(ByRef Pattern As WString, ByVal PatternLength As Integer)As Integer
- ' Заполняет строку символами
- Declare Sub PadString(ByVal StringToPadding As WString Ptr, ByVal StageLength As Integer, ByVal StringLength As Integer, ByRef Pattern As WString, ByVal PatternLength As Integer, ByVal StartSymbol As Integer, ByVal RepeatCount As Integer)
- Function GetListCount(ByRef Pattern As WString, ByVal PatternLength As Integer)As Integer
- Dim intResult As Integer = 1
- For i As Integer = 0 To PatternLength - 1
- Select Case Pattern[i]
- Case 35 ' код символа #
- intResult *= DigitsStringLength ' Цифры
- Case 36 ' код символа $
- intResult *= CharsStringLength ' Буквы
- End Select
- Next
- Return intResult
- End Function
- Sub PadString(ByVal StringToPadding As WString Ptr, ByVal StageLength As Integer, ByVal StringLength As Integer, ByRef Pattern As WString, ByVal PatternLength As Integer, ByVal StartSymbol As Integer, ByVal RepeatCount As Integer)
- Dim k As Integer ' Счётчик в цикле строки‐заменителя шаблона
- Dim r As Integer = 1 ' Повторитель
- For j As Integer = StartSymbol To StageLength - 1 Step StringLength
- Dim tmpChar As Integer = (Pattern)[k]
- StringToPadding[j] = tmpChar
- r += 1
- If r > RepeatCount Then
- r = 1
- k += 1
- End If
- If k >= PatternLength Then
- k = 0
- End If
- Next
- End Sub
- Function EntryPoint Alias "EntryPoint"()As Integer
- Dim hOut As Handle = GetStdHandle(STD_OUTPUT_HANDLE)
- ' Получить строку из параметров
- Dim ArgsCount As Integer = Any
- ' Массив параметров командной строки
- Dim Args As WString Ptr Ptr = CommandLineToArgvW(GetCommandLine(), @ArgsCount)
- If ArgsCount > 1 Then
- ' Первый параметр — строка‐шаблон
- ' Длина шаблона
- Dim PatternLength As Integer = lstrlen(*Args[1])
- ' Длина подстроки = шаблон + перевод строки
- Dim StringLength As Integer = PatternLength + NewLineLength
- ' Количество символов
- Dim StageLength As Integer = StringLength * GetListCount(*Args[1], PatternLength)
- ' Создать кучу
- Dim hHeap As Handle = HeapCreate(HEAP_NO_SERIALIZE, 0, 0)
- If hHeap <> NULL Then
- ' Выделить память в куче под массив строк
- Dim hMemory As WString Ptr = HeapAlloc(hHeap, HEAP_NO_SERIALIZE, (StageLength + 1) * SizeOf(WString))
- If hMemory <> 0 Then
- ' Заполнить память символами перевода строки
- ' При этом Винапи в конце автоматически поставит нулевой символ
- ' Нулевой символ находится в hMemory[StageLength]
- For i As Integer = PatternLength To StageLength - 1 Step StringLength
- lstrcpy(hMemory[i], NewLine) ' винапи добавляет в конце нулевой символ
- Next
- ' Количество повторений символа
- Dim RepeatCount As Integer = 1
- ' Обойти весь шаблон с конца
- For i As Integer = PatternLength - 1 To 0 Step -1
- Dim Symbol As Integer = (*Args[1])[i]
- Select Case Symbol
- Case 35 ' #
- ' Повторять цифры определённое количество раз
- PadString(hMemory, StageLength, StringLength, DigitsString, DigitsStringLength, i, RepeatCount)
- ' Увеличить количество повторений следующего символа
- RepeatCount *= DigitsStringLength
- Case 36 ' $
- ' Повторять буквы определённое количество раз
- PadString(hMemory, StageLength, StringLength, CharsString, CharsStringLength, i, RepeatCount)
- ' Увеличить количество повторений следующего символа
- RepeatCount *= CharsStringLength
- Case Else
- ' Повторять этот символ определённое количество раз
- For j As Integer = i To StageLength - 1 Step StringLength
- hMemory[j] = Symbol
- Next
- End Select
- Next
- ' Распечатать результат
- WriteConsole(hOut, hMemory, lstrlen(hMemory), 0, 0)
- Else
- ' Неудачное выделение памяти
- WriteConsole(hOut, @HeapAllocError, lstrlen(@HeapAllocError), 0, 0)
- End If
- ' Уничтожить кучу, при этом память отдавать куче не нужно
- HeapDestroy(hHeap)
- Else
- ' Неудачное создание кучи
- WriteConsole(hOut, @HeapCreateError, lstrlen(@HeapCreateError), 0, 0)
- End If
- Else
- ' Количество параметров не устраивает
- WriteConsole(hOut, @ErrorParams, lstrlen(@ErrorParams), 0, 0)
- End If
- LocalFree(Args)
- Return 0
- End Function
- EntryPoint()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement