LINUX.ORG.RU

Как переупорядочить комменты к define-ам?

 ,


2

2

Подкиньте, плз, команд, чтобы сделать из «такого» «этакое», хотя бы частично, и не перехерить при этом остальное.

Что имеем:

  • комменты в одной строке с дефайнами, style warnings о превышении рекомендуемой длины строки
  • блочные комменты не следуют стилю ядра линукс - style warnings «Block comments use a trailing */ on a separate line», «Block comments use * on subsequent lines»
#define TW5864_EMU_EN_PLBK       (1 << 5)	/* Enable bit for PLBK module */
#define TW5864_DSP_FRAME_TYPE    (3 << 6)	/* Video Frame mapping in DDR
						   00 CIF
						   01 D1
						   10 Reserved
						   11 Reserved
						 */
#define TW5864_DSP_FRAME_TYPE_D1 (1 << 6)

Что желаем:

  • комменты не в одной строке с дефайнами, а перед ними
  • блочные комменты следуют стилю ядра линукс - пустые первые и последние строки, звёздочки в начале каждой строки
/* Enable bit for PLBK module */
#define TW5864_EMU_EN_PLBK       (1 << 5)
/*
 * Video Frame mapping in DDR
 * 00 CIF
 * 01 D1
 * 10 Reserved
 * 11 Reserved
 */
#define TW5864_DSP_FRAME_TYPE    (3 << 6)
#define TW5864_DSP_FRAME_TYPE_D1 (1 << 6)

Полный файл дефайнов, на котором много проблем, обкатывать скрипты на нём: https://github.com/bluecherrydvr/linux/blob/tw5864_stable/drivers/staging/med...

Огромное спасибо за любую помощь. А то неохота воплощать совет GKH

Shouldn't take very long to do so, all of the above can be fixed in less than a day's worth of work manually.

Бери

#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

typedef struct{
	char *data;
	size_t len;
} mmapbuf;

mmapbuf *My_mmap(char *filename){
	int fd;
	char *ptr;
	size_t Mlen;
	struct stat statbuf;
	if(!filename) exit(-1);
	if((fd = open(filename, O_RDONLY)) < 0) exit(-2);
	if(fstat (fd, &statbuf) < 0) exit(-3);
	Mlen = statbuf.st_size;
	if((ptr = mmap (0, Mlen, PROT_READ, MAP_PRIVATE, fd, 0)) == MAP_FAILED)
		exit(-4);
	if(close(fd)) exit(-5);
	mmapbuf *ret = calloc(1, sizeof(mmapbuf));
	ret->data = ptr;
	ret->len = Mlen;
	return  ret;
}


int main(int argc, char **argv){
	mmapbuf *buf = My_mmap(argv[1]);
	char *afile = strdup(buf->data), *eptr = afile + buf->len;
	char *beforecom = NULL;
	while(afile < eptr){
		char *nl = strchr(afile, '\n');
		if(!nl){
			printf("%s\n", afile);
			return 0;
		}
		*nl++ = 0;
		char *commstart = strstr(afile, "/*");
		if(commstart){
			*commstart = 0;
			free(beforecom);
			beforecom = strdup(afile);
			commstart += 2;
			char *commend = NULL;
			if(*commstart) commend = strstr(commstart, "*/");
			if(commend){ // single comment
				*commend = 0;
				afile = commend + 2;
				printf("/* %s */\n", commstart);
				printf("%s%s\n", beforecom, afile);
				afile = nl + 1;
			}else{ // multiline comment
				printf("/*%s\n", commstart);
				commend = strstr(nl, "*/");
				if(!commend){
					printf("%s*/\n", nl);
					return -1;
				}
				*commend = 0;
				afile = commend + 2;
				if(*afile == '\n') ++afile;
				printf("%s*/\n", nl);
			}
		}else{
			printf("%s\n", afile);
			afile = nl;
		}
	}
}

Пробелы-табы сам уберешь, хоть sed'ом на выхлопе:

gcc 1.c && ./a.out tw5864-reg.h|sed -e 's/ \+/ /g' -e 's/\t\+/\t/g'
Eddy_Em ☆☆☆☆☆
()

А можно я не буду, как Eddy_Em, ничего писать и отлаживать, а ограничусь командой реформатирования комментария к одному дефайну:

C-u M-; C-j C-p C-y C-M-\

(это для ГНУ Емакса, разумеется)

Цикл по строчкам, удовлетворяющим условию, напишете?

Работать оно будет непозволительно долго, но вам же на один раз, верно?

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 2)
Ответ на: комментарий от Zmicier

Я ни разу не емаксер :(

Eddy_Em, что это за зверь, и почему он называется mmap?

Andrey_Utkin ★★
() автор топика

Shouldn't take very long to do so, all of the above can be fixed in less than a day's worth of work manually

see 1st and 2nd:

http://www.dbnet.ece.ntua.gr/~george/sed/OLD/sed-microcode.html

http://www.grymoire.com/unix/sed.html

cat  tw5864-reg.h |head -50 |sed -n  "/^#define/b main;b pr;:main;/\*\/$/b endinline;g;XXX;b pr;:endinline;h;s/^[^\/]*//;p;g;s/\/\*.*$//;:pr;p"

для свёртки блоккомента покури G H команды и вставь в XXX

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

А можно вас попросить сделать законченное решение? Хотя бы без свёртки. Если убрать «XXX;», оно работает, но неправильно, некоторые строки пропадают, некоторые дублируются. Даже в тех же 50 первых строках.

Andrey_Utkin ★★
() автор топика
Ответ на: комментарий от Andrey_Utkin

мда, майнтейнеры пошли нынче... не удивлюсь если и патч от себя выкатит, а qulinxao «случайно» забудет...

anonymous
()
Ответ на: комментарий от Eddy_Em

Отпусти чудо трава.

cat  tw5864-reg.h |cat|sed -n  '
/^#define/!b pr;/\/\*/! b pr
h;s|/\*.*$||;x;s|^[^/]*||
/\*\//b both
:multi
H;n;s/^[ \t][ \t]*/\ */;H
g;s/\/\*.*//;x;s/^[^/]*//
/\*\/$/!b multi
s|/\*|/*\n *|
:both
s|**/$|*/|;p;g
:pr
s/\n//g;p'

Сравни на бажность обе(сед и твою С) версии а?

qulinxao ★★☆
()
Последнее исправление: qulinxao (всего исправлений: 1)
Ответ на: Отпусти чудо трава. от qulinxao

аааааааааааа. Хватит

cat  tw5864-reg.h |cat|sed -n  '
/^#define/!b pr;/\/\*/! b pr
h;s|/\*.*$||;x;s|^[^/]*||
/\*\//b in1n
:multi
H;n;s/^[ \t][ \t]*/\ */;H
g;s|/\*.*$||; x;s|^[^/]*||
/\*\/$/!b multi
s|/\*|/*\n *|
s|**/$|*/|;s|*/|\n */|;
:in1n
p;g;
:pr
s/\n//g;p'
qulinxao ★★☆
()
Ответ на: аааааааааааа. Хватит от qulinxao

OMFG, это гений. Можно получить ваши контактные данные для консультаций на платной основе?

Только добавьте, пожалуйста, пробелы после звёздочки на дополнительных строках комментариев, а то:

/*
 * Video Frame mapping in DDR
 *00 CIF
 *01 D1
 *10 Reserved
 *11 Reserved
 
 */

Andrey_Utkin ★★
() автор топика

vim

$ cat doit.vim
:nnoremap <expr> gp '`[' . strpart(getregtype(), 0, 1) . '`]'
:let @b = '#define.*\s+\/\*'
:let @e = '\*\/'
:let @q = "/\<C-r>b/e-\<C-m>v/\<C-r>e/e\<C-m>dO\<Esc>pgp=@q"
:set nows
@q
:%s/\s\+$//g
:wq
$ vim -Nu NONE -i NONE -s doit.vim tw5864-reg.h
salsa
()

нет предела бес предела

cat  tw5864-reg.h |cat|sed -n  '
/^#define/!b pr;/\/\*/! b pr
h;s|/\*.*$||;x;s|^[^/]*||
/\*\//b bth
H;
:multi;n;s/^[ \t][ \t]*/ * /;H;/\*\/$/!b multi
g;s|/\*.*$||;x;s|^[^/]*||;s|/\*|/*\n *|
s|**/$|*/|;s|*/|\n */|;s_\n[ \t]*\n_\n_g
:bth
p;g;
:pr
s/\n//g;p'
qulinxao ★★☆
()

Наваяй конфиг для astyle.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

твой код твой.

вообще для этой задачи самым подходящим языком реализации либо awk|snoboll|icon| либо инструмент из llvm который строит ast-деревья.

т.е буквально lint-подобный с2с транслятор.

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

Таки я свой велосипед за 10 минут родил + еще с минуту потратил на поиск дырки. И таки що?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от qulinxao

у тебя зачем-то сплошное обмазывание памятью

Ты офигенно делишь на нуль. Мало того, что два лишних ката вызвал с пайпами, так еще и правило седу такое накатал, что там с полгига оперативы отожрет эта хрень, пока такую элементарщину решит!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

мы не в 1971 когда затхлый pdp-7 не мог полноценный qed Томпсонов на своих 8 Кб озу крутить.

с чего бы полгига то???

ну а про каты это копия из отладки второй кат не кат а хиад т.е |sed '60q'| например.

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

Там вообще ни одного ката не надо, есличо!

И вообще, поубивал бы тех, кто делает cat|sed, cat|grep и тому подобные [censored]

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от SZT

cpp не случайно и с пре процессор а в дальнейшем химера Страуструпова.

годный lint-о-инструмент способен парсить в дерево не только сами сырцы но и директивы препроцессора - а также переформачивать комменты.

qulinxao ★★☆
()
Ответ на: комментарий от SZT
  
   Most things worth reading carefully are likely to present some difficulties to the reader on a first reading. These difficulties tend to slow us up. But we should never allow them to stop us in our tracks.
   Readers who bog down completely because they cannot fully understand some statement or reference in the course of their reading fail to  recognize that no  one can be expected to achieve complete  understanding of a significant work on the first go at it.
   A first reading is bound to be a relatively superficial one, as compared  with the reading in greater and greater depth that can be done when one rereads the same work later
qulinxao ★★☆
()

Ребята, учите перл. Не, правда.

#!/usr/bin/perl -n

if (s{^#\s*define .*?\K(\s*)(/\*.*)}{}) {
  my ($define, $margin, $comment) = ($_, $1, $2);
  $margin = $-[1] + length($margin) + ($margin =~ tr/\t/\t/ * 7);
  if ($comment =~ m{\*/}) {
    print $comment, "\n";
  } else {
    $comment =~ s{/\*\K}{\n *};
    print $comment;
    while (<>) {
       s/\G\t/' ' x 8/ge;
       s/^ {$margin}//;
       print ' *' unless s{^\s*\*/}{ */};
       print;
       last if m{\*/};
    };
  };
  print $define;
  next;
};

print;
Jini ★★
()

Велосипедисты (в принципе все в этом треде), вы на indent или на astyle сначала глянули, прежде чем велосипедить? ;)

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.