<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CODARE &#187; Claudio Matsuoka</title>
	<atom:link href="http://codare.net/author/cmatsuoka/feed/" rel="self" type="application/rss+xml" />
	<link>http://codare.net</link>
	<description>Programadores, uni-vos!</description>
	<lastBuildDate>Fri, 03 Dec 2010 21:34:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>C: Checar se arquivos de entrada e saída são diferentes</title>
		<link>http://codare.net/2007/01/15/c-checar-arquivos-entrada-saida-sao-diferentes/</link>
		<comments>http://codare.net/2007/01/15/c-checar-arquivos-entrada-saida-sao-diferentes/#comments</comments>
		<pubDate>Mon, 15 Jan 2007 11:44:15 +0000</pubDate>
		<dc:creator>Claudio Matsuoka</dc:creator>
				<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://codare.net/2007/01/15/checar-arquivos-entrada-saida-sao-diferentes/</guid>
		<description><![CDATA[Palavras-chave: C, stdin, stdout, descritor, descriptor, inode, comparar, compare Ao escrever filtros (programas que processam dados provenientes da entrada padrão e os escrevem na saída padrão) pode-se querer evitar que o arquivo de entrada seja o mesmo arquivo utilizado para &#8230; <a href="http://codare.net/2007/01/15/c-checar-arquivos-entrada-saida-sao-diferentes/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Palavras-chave: C, stdin, stdout, descritor, descriptor, inode, comparar, compare</p>
<p>Ao escrever filtros (programas que processam dados provenientes da entrada padrão e os escrevem na saída padrão) pode-se querer evitar que o arquivo de entrada seja o mesmo arquivo utilizado para saída. Um exemplo de um programa assim seria um conversor de formato: o que fazer caso o filtro seja invocado como</p>
<pre>
        $ gif2png &lt; tempfile &gt; tempfile
</pre>
<p>ou ainda</p>
<pre>
        $ sig2uns tempfile &gt; tempfile
</pre>
<p>potencialmente corrompendo dados quando eles são lidos e processados em blocos?</p>
<p>Uma solução simples em sistemas que utilizam sistemas de arquivo similares aos do UNIX é comparar o número do inode e o dispositivo dos descritores de entrada e saída, sejam eles arquivos ou stdin/stdout. Isso pode ser implementado em C como:</p>
<pre>
        fstat(ifd, &amp;st);
        st.st_mode &amp;= S_IFMT;
        if (st.st_mode != S_IFCHR &amp;&amp; st.st_mode != S_IFBLK) {
                dev = st.st_dev;
                ino = st.st_ino;
        }

        fstat(ofd, &amp;st);
        st.st_mode &amp;= S_IFMT;
        if (st.st_dev == dev &amp;&amp; st.st_ino == ino) {
                /* entrada e saída são iguais */
                return 1;
        }
</pre>
<p>Isso é exatamente o que o programa &#8220;cat&#8221; faz. Se você experimentar fazer cat de um arquivo para ele mesmo, o resultado é:</p>
<pre>
        $ cat a.out &gt; a.out
        cat: a.out: input file is output file
</pre>
<p>Finalmente, note que isso não vale para dispositivos de caractere ou bloco, como tratado no trecho de código acima.</p>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2007/01/15/c-checar-arquivos-entrada-saida-sao-diferentes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C: Macros como funções com o while (0)</title>
		<link>http://codare.net/2007/01/08/c-macros-como-funcoes-com-o-while-0/</link>
		<comments>http://codare.net/2007/01/08/c-macros-como-funcoes-com-o-while-0/#comments</comments>
		<pubDate>Mon, 08 Jan 2007 11:22:19 +0000</pubDate>
		<dc:creator>Claudio Matsuoka</dc:creator>
				<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://codare.net/2007/01/08/macros-como-funcoes-com-o-while-0/</guid>
		<description><![CDATA[Palavras-chave: C, macro, multi-statement, cpp, pré-processador, preprocessor Com alguma freqüência é necessário de definir macros com múltiplos comandos (statements) que possam ser usados de forma sintaticamente equivalente a chamadas de função. Nesse caso, não basta definir uma seqüência como: #define &#8230; <a href="http://codare.net/2007/01/08/c-macros-como-funcoes-com-o-while-0/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Palavras-chave: C, macro, multi-statement, cpp, pré-processador, preprocessor</p>
<p>Com alguma freqüência é necessário de definir macros com múltiplos comandos (<em>statements</em>) que possam ser usados de forma sintaticamente equivalente a chamadas de função. Nesse caso, não basta definir uma seqüência como:</p>
<pre>
#define foo(x) a1(x); a2(x)
</pre>
<p>Isso seria desastroso após um <em>if</em>, por exemplo. Tampouco adiantaria delimitar o bloco com chaves, o que não funcionaria numa situação como:</p>
<pre>
if (y) foo(z); else return;
</pre>
<p>Como, então, podemos definir tais macros? A resposta é: utilizando expressões &#8220;do {&#8230;} while(0)&#8221;, cuja utilidade em outras situações é bastante duvidosa. Veja o exemplo:</p>
<pre>
#define foo(x) do { a1(x); a2(x); } while (0)
</pre>
<p>Definindo macros dessa forma, cumprimos nosso objetivo: apesar da declaração aparentemente estranha, seu uso é equivalente a uma chamada de função em qualquer caso, incluindo loops e condicionais.</p>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2007/01/08/c-macros-como-funcoes-com-o-while-0/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>C: Redirecionando stdout</title>
		<link>http://codare.net/2006/10/24/c-redirecionando-stdout/</link>
		<comments>http://codare.net/2006/10/24/c-redirecionando-stdout/#comments</comments>
		<pubDate>Wed, 25 Oct 2006 00:05:14 +0000</pubDate>
		<dc:creator>Claudio Matsuoka</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[descriptor]]></category>
		<category><![CDATA[descritor]]></category>
		<category><![CDATA[redireção]]></category>
		<category><![CDATA[redirection]]></category>
		<category><![CDATA[stdout]]></category>

		<guid isPermaLink="false">http://codare.wordpress.com/2006/10/24/redirecionando-stdout-em-c/</guid>
		<description><![CDATA[É comum em utilitários que rodam em um terminal e escrevem na saída padrão (stdout) a existência de um parâmetro que permite redirecionar a saída para um arquivo (geralmente -o). Uma maneira simples de implementar essa redireção é copiando o &#8230; <a href="http://codare.net/2006/10/24/c-redirecionando-stdout/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>É comum em utilitários que rodam em um terminal e escrevem na saída padrão (stdout) a existência de um parâmetro que permite redirecionar a saída para um arquivo (geralmente <tt>-o</tt>).</p>
<p>Uma maneira simples de implementar essa redireção é copiando o descritor do arquivo especificado para o descritor 1 (do stdout). Pode-se implementar isso da seguinte maneira, dentro do tratamento dos parâmetros de linha de comando:</p>
<pre>    case 'o':
        ofd = open(optarg, O_WRONLY|O_CREAT|O_TRUNC, 0644);
        if (ofd &lt; 0) {
            perror("open");
            exit(1);
        }
        dup2(ofd, STDOUT_FILENO);
        break;</pre>
<p>onde <tt>optarg</tt> é o parâmetro passado para <tt>-o</tt>. Assim, o restante do código pode ser escrito sem se preocupar com o arquivo de saída, usando printf() normalmente para escrever em stdout.</p>
]]></content:encoded>
			<wfw:commentRss>http://codare.net/2006/10/24/c-redirecionando-stdout/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

