Комментарии и описание

Тема в разделе "WASM.SOFTWARE", создана пользователем Perre, 21 май 2007.

  1. Perre

    Perre New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2007
    Сообщения:
    100
    У меня возник такой вопрос:
    Когда кода было мало, я мог запомнить (за комментировать) где какие процедуры и с какими параметрами их вызывать, но, когда прога разместилась в трёх папках и 15ти файлах, мне тяжело стало находить описание. Нет ли какой- нибудь программки, в которой можно хранить описание к процедурам и переменных (типа как в мсдн, только проще, и с возможностью самому всё записывать) ?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Создай свои CHM-ки, как в MSDN
     
  3. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    ИМХО удобнее DOXYGEN. Тогда все описания к функциям ты сможешь написать прямо в коде (в виде специально оформленных комментариев), а потом doxygen их все вытащит оттуда, оформит и откомпилирует в HTML или сразу запакует в CHM.
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Поддерживаю maxdiver. Доксиген прост, минималистичен и удобен. Для небольших проектов очень удобно, если требуется что-то большее - нужно смотреть в сторону коммерческих authoring средств, типа doc-o-matic & K°.
     
  5. Perre

    Perre New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2007
    Сообщения:
    100
    Можно более подробно про DOXYGEN и про коммерческие
    Где можно найти ?
     
  6. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    В гугле :)
    Например:
    http://www.stack.nl/~dimitri/doxygen/
    http://en.wikipedia.org/wiki/Doxygen

    В wiki, например, сразу увидишь простой пример использования doxygen. А на авторском сайте можно будет скачать и саму программу, и документацию к ней, и примеры, и faq, и исходники.
     
  7. Perre

    Perre New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2007
    Сообщения:
    100
    Ещё не было времени чтобы разобраться со всем этим, я решил написать свою программу
    (программка записывает в листинг слова после “;~”, при выделение показывает весь текст до следующей такой записи , или до конца файла )
    Указатель “;~” должен находится в начале строки
    По моему это очень удобно при просмотре файла макросов или своих файлов с такими закладками ( ;~ )
    И вот что получилось:
    (На программу можно перетаскивать файлы, или открывать через командную строку)

    В программе я нашёл пару недостатков, но подобный софт можно разрабатывать и модифицировать очень долго, поэтому прошу указать только те недостатки и пожелания, на которые время модификации будет не большое.

    В любом случае буду благодарен за ваши мнения


    Пример файла для открытия:
    Код (Text):
    1. ;;**************************** HI-TECH GROUP *****************************
    2. ;;               Windows Macros File
    3. ;; VERSION 1.4
    4. ;; CREATED 10.07.2003
    5. ;;
    6. ;; W A S M . R U [http://wasm.ru]
    7. ;;(c) Edmond 2002-2003
    8. ;;************************************************************************
    9. ;;************************************************************************
    10.  
    11. ;Эта программа фиксирована в памяти и может запуститься только по адресу
    12. PROGRAM_IMAGE_BASE  EQU 400000h
    13.  
    14.  
    15. ;=========================================================================
    16. ;           CONSTANTS
    17. ;=========================================================================
    18. $$$__null       EQU     ebx
    19. $$$__result     EQU     eax
    20. $$$__msg        EQU     edi
    21. $$$__hInstance      EQU     esi
    22. $$$__data       EQU     edx
    23. $$$__counter        EQU     ecx
    24. $$$__base       EQU     ebx
    25. ;=========================================================================
    26. ;           MACROS
    27. ;=========================================================================
    28. ;~WIN32START
    29. ;=========================================================================
    30. ;Этим макросом следует начинать ваш код прилоожения
    31.  
    32. $$$WIN32START       macro
    33.  
    34. PUBLIC  l$_ExitProgram
    35.  
    36. _start:                      
    37.  
    38.     xor ebx,ebx
    39.  
    40.             endm
    41. ;================================================================================
    42. ;~WIN32END
    43. ;================================================================================
    44. ; Этим макросом должен оканчиваться ваш главный модуль приложения
    45. ; При этом эа ним недолжно следовать никакого кода более
    46.                                                      
    47. $$$WIN32END     macro
    48.  
    49. l$_ExitProgram:              
    50.  
    51.     push    $$$__null
    52.     call    ExitProcess
    53.  
    54.    
    55.             end _start
    56.            
    57.             endm    
    58. ;================================================================================
    59. ;~EXITPROGRAM
    60. ;================================================================================
    61. ; Этот макрос вызванный в вашем главном модуле завершает вашу программу.
    62.  
    63. $$$EXITPROGRAM      macro
    64.  
    65.     push    $$$__null
    66.     call    ExitProcess
    67.  
    68.             endm
    69. $$$EXITAPP      macro
    70.         jmp l$_ExitProgram
    71.             endm
    72. ;================================================================================
    73. ;~WARNING
    74. ;================================================================================
    75. ; Этот макро позваляет выводить
    76. ; предупреждения в стандартном формате ML, определённые вами.
    77. ; Например: $$$WARNING "Не забутьте это исправить потом!!!"
    78. $$$WARNING      macro text
    79. %echo @CatStr(@FileCur,<(>,%@Line,<)>) : warning note: text
    80.             endm
    81. ;================================================================================
    82. ;~DLLSTART
    83. ;================================================================================
    84. ;DLL
    85. $$$DLLSTART     macro
    86. _start@12:
    87.  
    88. ;; Параметры, которые получает DLL
    89.  
    90. esp__hDLL       EQU dword ptr [esp+04h];; указатель на образ DLL
    91. esp__fdwReason      EQU dword ptr [esp+08h];; Причина вызова
    92. esp__fImpLoad       EQU dword ptr [esp+0ch];; Способ загрузки DLL ( 0 если загружена явно)
    93.  
    94.             endm
    95.            
    96. $$$DLLEND       macro
    97.  
    98.             mov al,1
    99.             ret 12
    100.            
    101.             end _start@12
    102.            
    103.            
    104.             endm
    105. ;=========================================================================
    106. ;~DLLFUN
    107. $$$DLLFUN       macro   name, status, params:VARARG
    108. ;;Проверка корректности поля status на корректность использования
    109. ;;Проверка происходит без различия регистра букв
    110. IFIDNI  <status>,<BEGIN>
    111. GOTO    ml__begin
    112. ELSEIFIDNI <status>,<END>
    113. GOTO    ml__end
    114. ELSE
    115. .ERR <$$$DLLFUN:неверное значение параметра №1 (status) - \
    116.     должен быть :BEGIN или END>
    117. ENDIF
    118.  
    119.             : ml__begin
    120.         push    ebp
    121.         mov ebp,esp
    122. $__DLLpcount = 0
    123. FOR param, <params>
    124. @CatStr(<ebp__>,param)      EQU dword ptr [ebp+08h+$__pcount*4]
    125. ;% echo @CatStr(%$__DLLpcount)
    126. $__DLLpcount = $__DLLpcount + 1               ; Count the parameters
    127. ENDM
    128. $__DLLpcount = $__DLLpcount*4
    129. @CatStr(<_>,name,<@>,%$__DLLpcount)     proc
    130. PUBLIC  @CatStr(<_>,name,<@>,%$__DLLpcount)
    131. GOTO ml__macroend
    132.             :ml__end
    133.         pop ebp
    134.         ret $__DLLpcount
    135. @CatStr(<_>,name,<@>,%$__DLLpcount)     endp
    136.             : ml__macroend
    137.            
    138.             endm  
    139. ;=========================================================================
    140. ;~DATAWCHAR
    141. ;=========================================================================
    142. ; Макросы для обработки строк
    143. ;=========================================================================
    144. ;=========================================================================
    145.  
    146. $$$_DATAWCHAR           MACRO   char
    147.  
    148. mp$__n  = 0
    149. mp$__latin      TEXTEQU @CatStr(' !"#$%&'()*+,<,>,-./0123456789:  = ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~)
    150. mp$__cyrilic    TEXTEQU <ЁЂЃЄЅІЇЈЉЊЋЌЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяёђѓєѕіїјљњћќўџҐґ>
    151.  
    152. mp$__char   EQU <char>
    153. ;; Найти в кирилице
    154. mp$__n  =   @InStr(1,%mp$__cyrilic,%mp$__char)
    155. IF  mp$__n
    156. ;; Если нашли, тогда
    157.     IF  mp$__n eq 60h
    158.         mp$__n = 90h
    159.     ELSEIF mp$__n eq 61h
    160.         mp$__n = 91h
    161.     ENDIF
    162. mp$__n = 401h + mp$__n
    163. ELSEIFIDN   <char>,<;>
    164.     ;;Если этот символ соотвествует ;
    165.     mp$__n  =   59
    166. ELSEIFB <char>
    167. mp$__n = 32
    168. ELSE   
    169.     ;; Иначе ищем в латинице
    170.     mp$__n  =   @InStr(2,%mp$__latin,%mp$__char)
    171.     mp$__n  =   mp$__n+1eh
    172. ENDIF
    173.                 ENDM
    174. ;;=========================================================================
    175. ;~GETCODEESCCHARA
    176. $$$_GETCODEESCCHARA     MACRO   char
    177. ;; Этот внутренний макро переводит специальные символы в цифры
    178.  
    179. IFIDN       <char>,<q>  ;; Ковычка '
    180. mp$__escchar    TEXTEQU <39>
    181. ELSEIFIDN   <char>,<Q>  ;; Ковычка "
    182. mp$__escchar    TEXTEQU <34>
    183. ELSEIFIDN   <char>,<t>  ;; Табуляция
    184. mp$__escchar    TEXTEQU <09h>
    185. ELSEIFIDN   <char>,<0>  ;; 0 ноль
    186. mp$__escchar    TEXTEQU <0>
    187. ELSEIFIDN   <char>,<[>  ;; >
    188. mp$__escchar    TEXTEQU <91>
    189. ELSEIFIDN   <char>,<]>  ;; <
    190. mp$__escchar    TEXTEQU <93>
    191. ELSEIFIDN   <char>,<]>  ;; <
    192. mp$__escchar    TEXTEQU <93>
    193. ELSEIFIDN   <char>,<{>  ;; Фигурные ковычки
    194. mp$__escchar    TEXTEQU <171>
    195. ELSEIFIDN   <char>,<}>  ;; Фигурные ковычки
    196. mp$__escchar    TEXTEQU <187>
    197. ELSEIFIDN   <char>,<c>  ;; Копирайт
    198. mp$__escchar    TEXTEQU <169>
    199. ELSEIFIDN   <char>,<r>  ;; Товарный знак
    200. mp$__escchar    TEXTEQU <174>
    201. ELSEIFIDN   <char>,<(>  ;; Двойные русские ковычки
    202. mp$__escchar    TEXTEQU <147>
    203. ELSEIFIDN   <char>,<)>  ;; Двойные русские ковычки
    204. mp$__escchar    TEXTEQU <148>
    205. ELSEIFIDN   <char>,<к> ;; Одинарные русские ковычки
    206. mp$__escchar    TEXTEQU <145>
    207. ELSEIFIDN   <char>,<п> ;; Одинарные русские ковычки
    208. mp$__escchar    TEXTEQU <146>
    209. ELSEIFIDN   <char>,<T>  ;; TM знак
    210. mp$__escchar    TEXTEQU <153>
    211. ELSEIFIDN   <char>,<&>  ;; \
    212. mp$__escchar    TEXTEQU <92>
    213. ELSEIFIDN   <char>,<n>  ;; Перевод строки
    214. mp$__escchar    TEXTEQU <0dh,0ah>
    215. ELSEIFIDN   <char>,<|>  ;; Воскл знак
    216. mp$__escchar    TEXTEQU <33>
    217.  
    218. ELSE
    219. mp$__escchar    TEXTEQU <>
    220. ENDIF
    221. ENDM
    222. ;;=========================================================================
    223. ;~GETCODEESCCHARW
    224. $$$_GETCODEESCCHARW     MACRO   char
    225.  
    226. ;; Этот внутренний макро переводит специальные символы в цифры
    227.  
    228. IFIDN       <char>,<q>  ;; Ковычка '
    229. mp$__escchar    TEXTEQU <39>
    230. ELSEIFIDN   <char>,<Q>  ;; Ковычка "
    231. mp$__escchar    TEXTEQU <34>
    232. ELSEIFIDN   <char>,<t>  ;; Табуляция
    233. mp$__escchar    TEXTEQU <09h>
    234. ELSEIFIDN   <char>,<0>  ;; 0 ноль
    235. mp$__escchar    TEXTEQU <00h>
    236. ELSEIFIDN   <char>,<[>  ;; >
    237. mp$__escchar    TEXTEQU <91>
    238. ELSEIFIDN   <char>,<]>  ;; <
    239. mp$__escchar    TEXTEQU <93>
    240. ELSEIFIDN   <char>,<]>  ;; <
    241. mp$__escchar    TEXTEQU <93>
    242. ELSEIFIDN   <char>,<{>  ;; Фигурные ковычки
    243. mp$__escchar    TEXTEQU <0abh>
    244. ELSEIFIDN   <char>,<}>  ;; Фигурные ковычки
    245. mp$__escchar    TEXTEQU <0bbh>
    246. ELSEIFIDN   <char>,<c>  ;; Копирайт
    247. mp$__escchar    TEXTEQU <0a9h>
    248. ELSEIFIDN   <char>,<r>  ;; Товарный знак
    249. mp$__escchar    TEXTEQU <0aeh>
    250. ELSEIFIDN   <char>,<(>  ;; Двойные русские ковычки
    251. mp$__escchar    TEXTEQU <201ch>
    252. ELSEIFIDN   <char>,<)>  ;; Двойные русские ковычки
    253. mp$__escchar    TEXTEQU <201dh>
    254. ELSEIFIDN   <char>,<к> ;; Одинарные русские ковычки
    255. mp$__escchar    TEXTEQU <2018h>
    256. ELSEIFIDN   <char>,<п> ;; Одинарные русские ковычки
    257. mp$__escchar    TEXTEQU <2019h>
    258. ELSEIFIDN   <char>,<T>  ;; TM знак
    259. mp$__escchar    TEXTEQU <2122h>
    260. ELSEIFIDN   <char>,<&>  ;; \
    261. mp$__escchar    TEXTEQU <92>
    262. ELSEIFIDN   <char>,<n>  ;; Перевод строки
    263. mp$__escchar    TEXTEQU <0dh,0ah>
    264. ELSEIFIDN   <char>,<|>  ;; Воскл знак
    265. mp$__escchar    TEXTEQU <33>
    266.  
    267. ELSE
    268. mp$__escchar    TEXTEQU <>
    269. ENDIF
    270. ENDM
    271. ;;=========================================================================
    272. ;~STRINGA
    273. $$$STRINGA      MACRO   name,string
    274.  
    275. mp$__string     TEXTEQU <>
    276. mp$__ni         =   0
    277. mp$__strtype    =   0
    278. mp$__quote1     EQU <'>
    279. mp$__quote2     EQU <">
    280. mp$__segcflag   =   0
    281.  
    282.  
    283. IFIDNI      @CurSeg,<_TEXT>
    284. mp$__segcflag   =   1
    285.                 .const
    286. ENDIF
    287.  
    288. &name   label   byte
    289.  
    290. FORC char, <string>
    291. IF  mp$__ni eq  0
    292. ;; Проверяем первый символ строки
    293.     IFIDN   <char>,<'>
    294.     mp$__strtype    =   1
    295.     ELSEIFIDN   <char>,<">
    296.     mp$__strtype    =   2
    297.     ELSE
    298. mp$__string TEXTEQU @CatStr(%mp$__string,char)
    299.     ENDIF
    300.  
    301. ELSE    ;; Не в первый раз
    302.     IFIDN   <char>,<'>
    303.         IF  mp$__strtype eq 1
    304.         ;; Если в строке начавшейся с одинарной ковычки,
    305.         ;; встретилась одинарная ковычка, и эта строка не пуста
    306.             IF  mp$__ni eq 1
    307.         .ERR <Ошибка определения строки:: Вы определили пустую строку ''>
    308.             ENDIF
    309.         ;; Значит строка закончена и мы выводим её
    310.         @CatStr(< db >,%mp$__quote1,%mp$__string,%mp$__quote1)
    311.         mp$__string TEXTEQU <>
    312.         EXITM
    313.         ENDIF
    314.     ELSEIFIDN   <char>,<">
    315.         IF  mp$__strtype eq 2
    316.         ;; Если в строке начавшейся с двойной ковычки,
    317.         ;; встретилась двойная ковычка, и эта строка не пуста
    318.         IF  mp$__ni eq 1
    319.         .ERR <Ошибка определения строки:: Вы определили пустую строку "">
    320.         ENDIF
    321.         ;; Значит строка закончена и мы выводим её
    322.         @CatStr(< db >,%mp$__quote2,%mp$__string,%mp$__quote2)
    323.         mp$__string TEXTEQU <>
    324.         EXITM
    325.         ENDIF
    326.     ENDIF
    327. ;; Не встретилось ничего интересного?
    328. mp$__xxchar TEXTEQU <char>
    329. mp$__string TEXTEQU @CatStr(%mp$__string,%mp$__xxchar)
    330. ENDIF
    331. mp$__ni = mp$__ni+1
    332. ENDM
    333.  
    334. IFNB mp$__string
    335. @CatStr(< db >,%mp$__quote1,%mp$__string,%mp$__quote1)
    336. ENDIF
    337.  
    338. IF  mp$__segcflag eq 1
    339.                     .code
    340. ENDIF
    341.                 ENDM
    342.  
    343. ;;=========================================================================
    344. ;~STRINGW
    345. $$$STRINGW      MACRO   name,string
    346.  
    347. mp$__quote1     EQU <'>
    348. mp$__quote2     EQU <">
    349.  
    350. mp$__segcflag   =   0
    351. IFIDNI      @CurSeg,<_TEXT>
    352. mp$__segcflag   =   1
    353.                 .const
    354. ENDIF
    355.  
    356. &name   label   word
    357.  
    358. mp$__string     TEXTEQU <>
    359. mp$__ni         =   0
    360. mp$__strtype    =   0
    361.  
    362.  
    363. FORC char, <string>
    364.  
    365. IF  mp$__ni eq  0
    366. ;; Проверяем первый символ строки
    367.     IFIDN   <char>,<'>
    368.     mp$__strtype    =   1
    369.     ELSEIFIDN   <char>,<">
    370.     mp$__strtype    =   2
    371. ;;  ELSE
    372. ;;.ERR <Ошибка определения строки первый символ обязан быть " или '>
    373.     ENDIF
    374.  
    375. ELSE    ;; Не в первый раз
    376.  
    377.     IFIDN   <char>,<'>
    378.         IF  mp$__strtype eq 1
    379.         ;; Если в строке начавшейся с одинарной ковычки,
    380.         ;; встретилась одинарная ковычка, и эта строка не пуста
    381.             IF  mp$__ni eq 1
    382.             .ERR <Ошибка определения строки:: Вы определили пустую строку ''>
    383.             ENDIF
    384.         ;; Значит строка закончена и мы выводим её
    385.         EXITM
    386.         ENDIF
    387.     ELSEIFIDN   <char>,<">
    388.         IF  mp$__strtype eq 2
    389.         ;; Если в строке начавшейся с двойной ковычки,
    390.         ;; встретилась двойная ковычка, и эта строка не пуста
    391.             IF  mp$__ni eq 1
    392.             .ERR <Ошибка определения строки:: Вы определили пустую строку "">
    393.             ENDIF
    394.         ;; Значит строка закончена и мы выводим её
    395.         EXITM
    396.         ENDIF
    397.     ENDIF
    398. ;; Не встретилось ничего интересного?
    399. ;; Добавляем ещё символ
    400. $$$_DATAWCHAR   char
    401.     IF @SizeStr(%mp$__string) gt 120
    402.     @CatStr(< dw >,%mp$__string)
    403.     mp$__string TEXTEQU @CatStr(%mp$__n)
    404.     mp$__ni =   0
    405.     ELSE
    406.  
    407.         IF  mp$__ni eq 1
    408. mp$__string TEXTEQU @CatStr(%mp$__n)
    409.         ELSE
    410. mp$__string TEXTEQU @CatStr(%mp$__string,<,>,%mp$__n)
    411.         ENDIF
    412.     ENDIF
    413. ENDIF
    414. mp$__ni = mp$__ni+1
    415. ENDM
    416.  
    417. @CatStr(< dw >,%mp$__string)
    418. IF  mp$__segcflag eq 1
    419.             .code
    420. ENDIF
    421.                 ENDM
    422.  
    423. ;;=========================================================================
    424. ;~ESCSTRINGA
    425. $$$ESCSTRINGA       MACRO   name,string
    426.  
    427. mp$__string     TEXTEQU <>
    428. mp$__ni         =   0
    429. mp$__strtype    =   0
    430. mp$__fescchar   =   0
    431. mp$__quote1     EQU <'>
    432. mp$__quote2     EQU <">
    433. mp$__segcflag   =   0
    434.  
    435. IFIDNI      @CurSeg,<_TEXT>
    436. mp$__segcflag   =   1
    437.                 .const
    438. ENDIF
    439.  
    440. &name   label   byte
    441.  
    442. FORC char, <string>
    443. IF  mp$__ni eq  0
    444. ;; Проверяем первый символ строки
    445.     IFIDN   <char>,<'>
    446.     mp$__strtype    =   1
    447.     ELSEIFIDN   <char>,<">
    448.     mp$__strtype    =   2
    449.     ELSE
    450. mp$__string TEXTEQU @CatStr(%mp$__string,char)
    451.     ENDIF
    452.  
    453. ELSE    ;; Не в первый раз
    454.  
    455. ;; Проверка на управляющий символ
    456.     IFIDN   <char>,<\>
    457.         IF  mp$__fescchar eq 0
    458.         mp$__fescchar   =   1
    459.         ENDIF
    460.     GOTO ml$__next
    461.     ENDIF
    462.  
    463.     IF  mp$__fescchar eq 1
    464.     $$$_GETCODEESCCHARA char
    465.         IFB mp$__escchar
    466.     ;; Если управляющего символа несуществует
    467.     ;; То мы добавляем в строку такое дело
    468.     mp$__string TEXTEQU @CatStr(%mp$__string,<\>,char)
    469.     ELSE
    470.         IF @SizeStr(%mp$__string) gt 0
    471.         @CatStr(< db >,%mp$__quote1,%mp$__string,%mp$__quote1)
    472.         ENDIF
    473.         @CatStr(< db >,%mp$__escchar)
    474.         mp$__string TEXTEQU <>
    475.         mp$__ni         =   0
    476.         ENDIF
    477.     mp$__fescchar   =   0;
    478.     GOTO    ml$__next
    479.     ENDIF
    480.  
    481.     IFIDN   <char>,<'>
    482.         IF  mp$__strtype eq 1
    483.         ;; Если в строке начавшейся с одинарной ковычки,
    484.         ;; встретилась одинарная ковычка, и эта строка не пуста
    485.             IF  mp$__ni eq 1
    486.             EXITM
    487.             ENDIF
    488.         ;; Значит строка закончена и мы выводим её
    489.         @CatStr(< db >,%mp$__quote1,%mp$__string,%mp$__quote1)
    490.         mp$__string TEXTEQU <>
    491.         EXITM
    492.         ENDIF
    493.     ELSEIFIDN   <char>,<">
    494.         IF  mp$__strtype eq 2
    495.         ;; Если в строке начавшейся с двойной ковычки,
    496.         ;; встретилась двойная ковычка, и эта строка не пуста
    497.         IF  mp$__ni eq 1
    498.         EXITM
    499.         ENDIF
    500.         ;; Значит строка закончена и мы выводим её
    501.         @CatStr(< db >,%mp$__quote2,%mp$__string,%mp$__quote2)
    502.         mp$__string TEXTEQU <>
    503.         EXITM
    504.         ENDIF
    505.     ENDIF
    506. ;; Не встретилось ничего интересного?
    507. mp$__xxchar TEXTEQU <char>
    508. mp$__string TEXTEQU @CatStr(%mp$__string,%mp$__xxchar)
    509. ENDIF
    510.  
    511.                 :ml$__next
    512. mp$__ni = mp$__ni+1
    513. ENDM
    514.  
    515. IFNB mp$__string
    516. @CatStr(< db >,%mp$__quote1,%mp$__string,%mp$__quote1)
    517. ENDIF
    518.  
    519. IF  mp$__segcflag eq 1
    520.                     .code
    521. ENDIF
    522.                 ENDM
    523.  
    524. ;;=========================================================================
    525. ;~ESCSTRINGW
    526. $$$ESCSTRINGW       MACRO   name,string
    527.  
    528. mp$__quote1     EQU <'>
    529. mp$__quote2     EQU <">
    530.  
    531. mp$__fescchar   =   0
    532. mp$__segcflag   =   0
    533. IFIDNI      @CurSeg,<_TEXT>
    534. mp$__segcflag   =   1
    535.                 .const
    536. ENDIF
    537.  
    538. &name   label   word
    539.  
    540. mp$__string     TEXTEQU <>
    541. mp$__ni     =   0
    542. mp$__strtype    =   0
    543.  
    544.  
    545. FORC char, <string>
    546.  
    547. IF  mp$__ni eq  0
    548. ;; Проверяем первый символ строки
    549.     IFIDN   <char>,<'>
    550.     mp$__strtype    =   1
    551.     ELSEIFIDN   <char>,<">
    552.     mp$__strtype    =   2
    553. ;;  ELSE
    554. ;;.ERR <Ошибка определения строки первый символ обязан быть " или '>
    555.     ENDIF
    556.  
    557. ELSE    ;; Не в первый раз
    558.  
    559.     IFIDN   <char>,<\>
    560.         IF  mp$__fescchar eq 0
    561.         mp$__fescchar   =   1
    562.         ENDIF
    563.     GOTO ml$__next
    564.     ENDIF
    565.  
    566.     IF  mp$__fescchar eq 1
    567.     $$$_GETCODEESCCHARW char
    568.         IFB mp$__escchar
    569.     ;; Если управляющего символа несуществует
    570.     ;; То мы добавляем в строку такое дело
    571.         $$$_DATAWCHAR   char
    572.             IF  mp$__ni eq 2
    573.             mp$__string TEXTEQU @CatStr(<5ch>,<,>,%mp$__n)
    574.             ELSE
    575.             mp$__string TEXTEQU @CatStr(%mp$__string,<,>,<5ch>,<,>,%mp$__n)
    576.             ENDIF
    577.         ELSE
    578.             IF  mp$__ni eq 2
    579.             mp$__string TEXTEQU @CatStr(%mp$__escchar)
    580.             ELSE
    581.             mp$__string TEXTEQU @CatStr(%mp$__string,<,>,%mp$__escchar)
    582.             ENDIF
    583.         ENDIF
    584.     mp$__fescchar   =   0;
    585.     GOTO    ml$__next
    586.     ENDIF
    587.  
    588.     IFIDN   <char>,<'>
    589.         IF  mp$__strtype eq 1
    590.         ;; Если в строке начавшейся с одинарной ковычки,
    591.         ;; встретилась одинарная ковычка, и эта строка не пуста
    592.             IF  mp$__ni eq 1
    593.             .ERR <Ошибка определения строки:: Вы определили пустую строку ''>
    594.             ENDIF
    595.         ;; Значит строка закончена и мы выводим её
    596.         EXITM
    597.         ENDIF
    598.     ELSEIFIDN   <char>,<">
    599.         IF  mp$__strtype eq 2
    600.         ;; Если в строке начавшейся с двойной ковычки,
    601.         ;; встретилась двойная ковычка, и эта строка не пуста
    602.             IF  mp$__ni eq 1
    603.             .ERR <Ошибка определения строки:: Вы определили пустую строку "">
    604.             ENDIF
    605.         ;; Значит строка закончена и мы выводим её
    606.         EXITM
    607.         ENDIF
    608.     ENDIF
    609. ;; Не встретилось ничего интересного?
    610. ;; Добавляем ещё символ
    611. $$$_DATAWCHAR   char
    612.     IF @SizeStr(%mp$__string) gt 120
    613.     @CatStr(< dw >,%mp$__string)
    614.     mp$__string TEXTEQU @CatStr(%mp$__n)
    615.     mp$__ni =   1
    616.     ELSE
    617.                                    
    618.         IF  mp$__ni eq 1
    619. mp$__string TEXTEQU @CatStr(%mp$__n)
    620.         ELSE
    621. mp$__string TEXTEQU @CatStr(%mp$__string,<,>,%mp$__n)
    622.         ENDIF
    623.     ENDIF
    624. ENDIF
    625.         :ml$__next
    626.    
    627. mp$__ni = mp$__ni+1
    628. ENDM
    629.  
    630. @CatStr(< dw >,%mp$__string)
    631. IF  mp$__segcflag eq 1
    632.                     .code
    633. ENDIF
    634.                 ENDM
    635.  
    636. ;;=========================================================================
    637. ;~STRING
    638. $$$STRING       MACRO   name,string
    639. ;; Этот макрос производит создание строк
    640. IFDEF   UNICODE_DEF
    641. $$$STRINGW  name,string
    642. ELSE
    643. $$$STRINGA  name,string
    644. ENDIF
    645.  
    646.                 ENDM
    647.  
    648. ;;=========================================================================
    649. ;~ESCSTRING
    650. $$$ESCSTRING        MACRO   name,string
    651. ;; Этот макрос производит создание строк
    652. IFDEF   UNICODE_DEF
    653. $$$ESCSTRINGW   name,string
    654. ELSE
    655. $$$ESCSTRINGA   name,string
    656. ENDIF
    657.  
    658.                 ENDM
    659. ;;=========================================================================
    660. ;~ZSTRINGA
    661. $$$ZSTRINGA     MACRO   name,string
    662. ;; Этот макрос производит создание строк
    663. $$$STRINGA  name,string
    664. IF  mp$__segcflag eq 1
    665.             .const
    666. ENDIF
    667.     db  00h
    668. IF  mp$__segcflag eq 1
    669.             .code
    670. ENDIF
    671.                 ENDM
    672.  
    673. ;;=========================================================================
    674. ;~ZSTRINGW
    675. $$$ZSTRINGW     MACRO   name,string
    676. ;; Этот макрос производит создание строк
    677. $$$STRINGW  name,string
    678. IF  mp$__segcflag eq 1
    679.             .const
    680. ENDIF
    681.     dw  00h
    682. IF  mp$__segcflag eq 1
    683.             .code
    684. ENDIF
    685.             ENDM
    686. ;;=========================================================================
    687. ;~ZSTRING
    688. $$$ZSTRING      MACRO   name,string
    689. ;; Этот макрос производит создание строк
    690. IFDEF   UNICODE_DEF
    691. $$$ZSTRINGW name,string
    692. ELSE
    693. $$$ZSTRINGA name,string
    694. ENDIF
    695.             ENDM
    696. ;;=========================================================================
    697. ;~ESCZSTRINGA
    698. $$$ESCZSTRINGA      MACRO   name,string
    699. ;; Этот макрос производит создание строк
    700. $$$ESCSTRINGA   name,string
    701. IF  mp$__segcflag eq 1
    702.             .const
    703. ENDIF
    704.     db  00h
    705. IF  mp$__segcflag eq 1
    706.             .code
    707. ENDIF
    708.                 ENDM
    709.  
    710. ;;=========================================================================
    711. ;~ESCZSTRINGW
    712. $$$ESCZSTRINGW      MACRO   name,string
    713. ;; Этот макрос производит создание строк
    714. $$$ESCSTRINGW   name,string
    715. IF  mp$__segcflag eq 1
    716.             .const
    717. ENDIF
    718.     dw  00h
    719. IF  mp$__segcflag eq 1
    720.             .code
    721. ENDIF
    722.                 ENDM
    723.  
    724. ;;=========================================================================
    725. ;~ESCZSTRING
    726. $$$ESCZSTRING       MACRO   name,string
    727. ;; Этот макрос производит создание строк
    728. IFDEF   UNICODE_DEF
    729. $$$ESCZSTRINGW  name,string
    730. ELSE
    731. $$$ESCZSTRINGA  name,string
    732. ENDIF
    733.  
    734.                 ENDM
    735. ;;=========================================================================
    736. ;~STACKFRAME
    737. ;;=========================================================================
    738. ;;          Стековый фрейм
    739. ;;  Макро для определения локальных переменных процедур
    740. ;;=========================================================================
    741. ;;=========================================================================
    742. $$$STACKFRAME       macro   status,params:VARARG
    743. ;; Макрос, который автоматически создаёт фрейм для процедуры
    744. ;; npparam - количество параметров процедуры
    745. ;; Проверка корректности поля status на корректность использования
    746. ;; Проверка происходит без различия регистра букв
    747. IFIDNI  <status>,<BEGIN>
    748. GOTO    ml__begin
    749. ELSEIFIDNI <status>,<END>
    750. GOTO    ml__end
    751. ELSEIFIDNI <status>,<ALIGN>
    752. GOTO    ml__align
    753. ELSE
    754. .ERR <$$$STACKFRAME:неверное значение параметра №1 (status) - \
    755.     должен быть :BEGIN, END или ALIGN>
    756. ENDIF
    757.             : ml__align
    758. IFB <params>
    759. ;; Если параметр выравнивания равен 0, значит выравнивания нет
    760. $__stackframe_align = 0
    761. ELSE
    762. $__stackframe_align = params
    763. ;; Создаём маску для выравнивания значение esp
    764. $__stackframe_align = not $__stackframe_align
    765. ENDIF
    766. GOTO ml__macroend
    767.             : ml__begin
    768. $__pcount = 0
    769. FOR param, <params>
    770. @CatStr(<ebp__>,param,< EQU >,<!<dword ptr [ebp+>,%(08h+$__pcount*4),<]!>>)
    771. $__pcount = $__pcount + 1   ;; Count the parameters
    772. ENDM
    773. $__funparam = $__pcount*4
    774.  
    775. IF $__funparam ne 0
    776.     push    ebp
    777.     mov ebp,esp
    778.     IF $__stackframe_align ne 0
    779.     push    ebp
    780.     and esp,$__stackframe_align
    781.     ENDIF
    782. ENDIF
    783.  
    784. GOTO ml__macroend
    785.             :ml__end
    786.         $__funparam =   0
    787.     IF $__stackframe_align ne 0
    788.         pop ebp
    789.     $__stackframe_align = 0
    790.     ENDIF
    791.         pop ebp
    792. IFIDNI  <params>,<RET>
    793.         ret $__pcount*4
    794. ENDIF
    795.             : ml__macroend
    796.             endm  
    797.            
    798. ;=======================================================================
    799. ;~LOCAL
    800. ;=========================================================================
    801.  
    802. $$$LOCAL        macro   status
    803. ;; Макро, который определяет определения локальных переменных
    804. ;; Проверка корректности поля status на корректность использования
    805. ;; Проверка происходит без различия регистра букв
    806. IFIDNI  <status>,<BEGIN>
    807. GOTO    ml__begin
    808. ELSEIFIDNI <status>,<DEL>
    809. GOTO    ml__del
    810. ELSEIFIDNI <status>,<END>
    811. GOTO    ml__end
    812. ELSE
    813. .ERR <$$$LOCAL:неверное значение параметра №1 (status) - \
    814.     должен быть :BEGIN или END>
    815. ENDIF
    816.  
    817.             : ml__begin
    818. $__stecksize        =   0
    819. $__varcount     =   0
    820. ;; Проверим, был ли определён стековый кадр
    821. IF  $__funparam eq  0
    822. ;; Если стекового кадра нет, создаём его
    823.             push    ebp
    824.             mov ebp,esp
    825. ENDIF
    826. GOTO ml__macroend
    827.             :ml__del
    828.             add esp,@CatStr(%$__stecksize)
    829. GOTO ml__macroend          
    830.             :ml__end
    831. ;; Выделяем в стеке столько данных сколько указанно
    832. IF  $__stecksize    ne  0
    833.             sub esp,@CatStr(%$__stecksize)
    834. ENDIF
    835. ;; $__stecksize =   0
    836.             : ml__macroend
    837.             endm  
    838.            
    839. ;=======================================================================
    840. ;~LVARS
    841. ;=========================================================================
    842.  
    843. $$$LVARS        macro   params:VARARG
    844. FOR param, <params>
    845. @CatStr(<l_>,param) EQU dword ptr [ebp+08h+$__varcount*4]
    846. $__varcount = $__varcount + 1               ; Count the parameters
    847. ENDM
    848. $__stecksize    =   $__stecksize+$__varcount*4
    849. GOTO ml__macroend
    850.                 :ml__macroend
    851.             endm  
    852.    
    853. ;=======================================================================
    854. ;~Language
    855. ;;======================================================================
    856. ;;======================================================================
    857. ;; Макро для поддержки языков
    858. ;;======================================================================
    859. ;;======================================================================
    860. ;;
    861. ;;  A language ID is a 16 bit value which is the combination of a
    862. ;;  primary language ID and a secondary language ID.  The bits are
    863. ;;  allocated as follows:
    864. ;;
    865. ;;       +-----------------------+-------------------------+
    866. ;;       |     Sublanguage ID    |   Primary Language ID   |
    867. ;;       +-----------------------+-------------------------+
    868. ;;        15                   10 9                       0   bit
    869. ;;
    870. ;;
    871. ;;  Language ID creation/extraction macros:
    872. ;;
    873. ;;    MAKELANGID    - construct language id from a primary language id and
    874. ;;                    a sublanguage id.
    875. ;;    PRIMARYLANGID - extract primary language id from a language id.
    876. ;;    SUBLANGID     - extract sublanguage id from a language id.
    877. ;;
    878. ;~MAKELANGID  
    879. $$$MAKELANGID       macro p:REQ,s:REQ
    880. m$__langid = (s SHL 10) or p
    881.             EXITM <m$__langid>
    882.             endm
    883. ;~PRIMARYLANGID
    884. $$$PRIMARYLANGID    macro lgid:REQ
    885. m$__langid = lgid and 03ffh
    886.             EXITM <m$__langid>
    887.             endm
    888. ;~SUBLANGID
    889. $$$SUBLANGID        macro lgid:REQ
    890. m$__langid = lgid SHR 10    
    891.             EXITM <m$__langid>
    892.             endm
    893.  
    894. ;~help
    895. программка записывает в листинг слова после ';~', при выделение показывает весь текст до следующей такой записи , или до конца файла )
    896. Указатель ';~' должен находится в начале строки
     
  8. Perre

    Perre New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2007
    Сообщения:
    100
    Странно, прикреплённый файл не могу сам открыть :dntknw:
     
  9. OldDino

    OldDino New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    44
    Не совсем согласен насчёт DoxyGen'а. Возможно, самый крупный его недостаток - это замусоривание кода. При просмотре файла приходится продираться сквозь комментарии и среди них отыскивать код. Именно этим он мне и не нравится. Хотя по остальным показателям ему, наверное, нет альтернативы.
    Но, скажем, если написать макрос, который будет в C++ работать как "#region - #endregion" в студийном C#, и "прятать" в этот регион документирующий комментарий, то цена такой связки (DoxyGen + макрос) с точки зрения пользователей будет, думаю, достаточно высокой.

    С уважением,

    OldDino
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    OldDino
    Согласен, но ведь студия и так сворачивает многострочные комментарии. Да и пользовательские блоки (#pragma region) уже добавили в vc2k5.
     
  11. OldDino

    OldDino New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    44
    Да, правильно, но ведь не все же работают в VS. Поэтому я и написал "в СТУДИЙНОМ C#", но ни словом не обмолвился насчёт того, о каком С++ речь идёт.
    Да и не в этом вообщем-то дело. Главное - DoxyGen'ом код замусоривается, поэтому для улучшения читабельности кода неплохо было бы документирующие комментарии "обрегионивать".

    С уважением,

    OldDino
     
  12. Perre

    Perre New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2007
    Сообщения:
    100
    Обновил (вроде глюков больше нету)