<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=470204&amp;view=findpost&amp;p=3933495</guid>
        <pubDate>Wed, 17 Dec 2025 21:39:31 +0000</pubDate>
        <title>Недокументированные esacpe-последовательности &amp;#092;( &amp;#092;[ &amp;#092;{</title>
        <link>https://forum.sources.ru/index.php?showtopic=470204&amp;view=findpost&amp;p=3933495</link>
        <description><![CDATA[grgdvo: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=470204&view=findpost&p=3932823'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>SergeyIT &#064; <time class="tag-quote__quoted-time" datetime="2025-12-05T23:56:40+03:00">05.12.25, 20:56</time></span><div class='quote '>А зачем ты так печатаешь? Какой смысл в &#092;{ и т.д. ?<br>
Это же непечатаемые команды вставлять в вывод сделано.</div></div><br>
<br>
Специально мне это не нужно, но решаю некоторую задачу с esc-последовательностями, _случайно_ обнаружил, что так можно.<br>
Т.е. указание &#092;{ приведет к просто { и т.д.<br>
Возник вопрос: почему так?? почему можно только именно &#092;{ &#092;[ &#092;( (как перечислено в первом моем сообщении).<br>
<br>
<a class='tag-url' href='https://github.com/gcc-mirror/gcc/blob/12084561db6c17158d268f4e22a8a6fe047f6f35/libcpp/charset.cc#L2385' target='_blank'>Ответ в исходниках gcc</a> (clang не проверял)<br>
<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">static const uchar *</div><div class="code_line">convert_escape (cpp_reader *pfile, const uchar *from, const uchar *limit, ...</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;...</div><div class="code_line">&nbsp;&nbsp;c = *from;</div><div class="code_line">&nbsp;&nbsp;switch (c)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;...</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;case &#39;(&#39;: case &#39;{&#39;: case &#39;[&#39;: case &#39;%&#39;:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;/* &#39;\(&#39;, etc, can be used at the beginning of a line in a long</div><div class="code_line">&nbsp;&nbsp; &nbsp; string split onto multiple lines with \-newline, to prevent</div><div class="code_line">&nbsp;&nbsp; &nbsp; Emacs or other text editors from getting confused. &nbsp;&#39;\%&#39; can</div><div class="code_line">&nbsp;&nbsp; &nbsp; be used to prevent SCCS from mangling printf format strings. &nbsp;*/</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (CPP_PEDANTIC (pfile))</div><div class="code_line">&nbsp;&nbsp; &nbsp;goto unknown;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;break;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
Полагаясь на комментарий разработчиков GCC, так разрешили экранировать,<br>
чтобы помогать всяким редакторам правильно распознавать вложенность скобочек<br>
в многострочных строковых литералах. Огонь&#33;<br>
<br>
Думаю вопрос решен.<br>
Всем спасибо&#33;]]></description>
        <author>grgdvo</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=470204&amp;view=findpost&amp;p=3932823</guid>
        <pubDate>Fri, 05 Dec 2025 20:56:40 +0000</pubDate>
        <title>Недокументированные esacpe-последовательности &amp;#092;( &amp;#092;[ &amp;#092;{</title>
        <link>https://forum.sources.ru/index.php?showtopic=470204&amp;view=findpost&amp;p=3932823</link>
        <description><![CDATA[SergeyIT: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=470204&view=findpost&p=3932816'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>grgdvo &#064; <time class="tag-quote__quoted-time" datetime="2025-12-05T16:53:37+00:00">05.12.25, 16:53</time></span><div class='quote '> почему компилятор gcc не ругается на escape-последовательности &#092;{ &#092;( &#092;[, но при этом ругается на &#092;} &#092;) &#092;] </div></div><br>
<br>
А зачем ты так печатаешь? Какой смысл в &#092;{ и т.д.  ?<br>
Это же непечатаемые команды вставлять в вывод сделано.<br>
<br>
А если про ESC последовательности почитать хочешь то это типа<br>
<a class='tag-url' href='https://microsin.net/adminstuff/xnix/ansivt100-terminal-control-escape-sequences.html' target='_blank'>https://microsin.net/adminstuff/xnix/ansivt...-sequences.html</a><br>
<br>
Как это использовать, в файле игра 2048 для терминала (не моя, я кое-что только подправил)<br>
<div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">2048.c</div><div class="body"><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">/*</div><div class="code_line">&nbsp;============================================================================</div><div class="code_line">&nbsp;Name &nbsp; &nbsp; &nbsp; &nbsp;: 2048.c</div><div class="code_line">&nbsp;Author &nbsp; &nbsp; &nbsp;: Maurits van der Schee</div><div class="code_line">&nbsp;Description : Console version of the game &quot;2048&quot; for GNU/Linux</div><div class="code_line">&nbsp;============================================================================</div><div class="code_line">&nbsp;*/</div><div class="code_line">&nbsp;</div><div class="code_line">#define _XOPEN_SOURCE 500</div><div class="code_line">#include &#60;stdio.h&#62;</div><div class="code_line">#include &#60;stdlib.h&#62;</div><div class="code_line">#include &#60;string.h&#62;</div><div class="code_line">#include &#60;unistd.h&#62;</div><div class="code_line">#include &#60;termios.h&#62;</div><div class="code_line">#include &#60;stdbool.h&#62;</div><div class="code_line">#include &#60;stdint.h&#62;</div><div class="code_line">#include &#60;time.h&#62;</div><div class="code_line">#include &#60;signal.h&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">#define SIZE 4</div><div class="code_line">uint32_t score=0;</div><div class="code_line">uint8_t scheme=0;</div><div class="code_line">&nbsp;</div><div class="code_line">void getColor(uint16_t value, char *color, size_t length) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;uint8_t original[] = {8,255,1,255,2,255,3,255,4,255,5,255,6,255,7,255,9,0,10,0,11,0,12,0,13,0,14,0,255,0,255,0};</div><div class="code_line">&nbsp;&nbsp; &nbsp;uint8_t blackwhite[] = {232,255,234,255,236,255,238,255,240,255,242,255,244,255,246,0,248,0,249,0,250,0,251,0,252,0,253,0,254,0,255,0};</div><div class="code_line">&nbsp;&nbsp; &nbsp;uint8_t bluered[] = {235,255,63,255,57,255,93,255,129,255,165,255,201,255,200,255,199,255,198,255,197,255,196,255,196,255,196,255,196,255,196,255};</div><div class="code_line">&nbsp;&nbsp; &nbsp;uint8_t *schemes[] = {original,blackwhite,bluered};</div><div class="code_line">&nbsp;&nbsp; &nbsp;uint8_t *background = schemes[scheme]+0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;uint8_t *foreground = schemes[scheme]+1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (value &#62; 0) while (value &#62;&#62;= 1) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (background+2&#60;schemes[scheme]+sizeof(original)) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;background+=2;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;foreground+=2;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;snprintf(color,length,&quot;3[38;5;%d;48;5;%dm&quot;,*foreground,*background);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void drawBoard(uint16_t board[SIZE][SIZE]) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;int8_t x,y;</div><div class="code_line">&nbsp;&nbsp; &nbsp;char color[40], reset[] = &quot;3[m&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;3[H&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;2048.c %17d pts\n\n&quot;,score);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (y=0;y&#60;SIZE;y++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for (x=0;x&#60;SIZE;x++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;getColor(board[x][y],color,40);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;%s&quot;,color);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot; &nbsp; &nbsp; &nbsp; &quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;%s&quot;,reset);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for (x=0;x&#60;SIZE;x++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;getColor(board[x][y],color,40);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;%s&quot;,color);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (board[x][y]!=0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;char s[8];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;snprintf(s,8,&quot;%u&quot;,board[x][y]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int8_t t = 7-strlen(s);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;%*s%s%*s&quot;,t-t/2,&quot;&quot;,s,t/2,&quot;&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot; &nbsp; · &nbsp; &quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;%s&quot;,reset);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for (x=0;x&#60;SIZE;x++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;getColor(board[x][y],color,40);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;%s&quot;,color);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot; &nbsp; &nbsp; &nbsp; &quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;%s&quot;,reset);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot; &nbsp; &nbsp; &nbsp; &nbsp;←,↑,→,↓ or q &nbsp; &nbsp; &nbsp; &nbsp;\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;3[A&quot;);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int8_t findTarget(uint16_t array[SIZE],int8_t x,int8_t stop) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;int8_t t;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// if the position is already on the first, don&#39;t evaluate</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (x==0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return x;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;for(t=x-1;t&#62;=0;t--) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (array[t]!=0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (array[t]!=array[x]) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// merge is not possible, take next position</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return t+1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return t;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;} else {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// we should not slide further, return this one</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (t==stop) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return t;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;// we did not find a</div><div class="code_line">&nbsp;&nbsp; &nbsp;return x;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">bool slideArray(uint16_t array[SIZE]) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;bool success = false;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int8_t x,t,stop=0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (x=0;x&#60;SIZE;x++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (array[x]!=0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;t = findTarget(array,x,stop);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// if target is not original position, then move or merge</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (t!=x) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// if target is not zero, set stop to avoid double merge</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (array[t]!=0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;score+=array[t]+array[x];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;stop = t+1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;array[t]+=array[x];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;array[x]=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;success = true;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;return success;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void rotateBoard(uint16_t board[SIZE][SIZE]) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;int8_t i,j,n=SIZE;</div><div class="code_line">&nbsp;&nbsp; &nbsp;uint16_t tmp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (i=0; i&#60;n/2; i++){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for (j=i; j&#60;n-i-1; j++){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;tmp = board[i][j];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;board[i][j] = board[j][n-i-1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;board[j][n-i-1] = board[n-i-1][n-j-1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;board[n-i-1][n-j-1] = board[n-j-1][i];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;board[n-j-1][i] = tmp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">bool moveUp(uint16_t board[SIZE][SIZE]) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;bool success = false;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int8_t x;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (x=0;x&#60;SIZE;x++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;success |= slideArray(board[x]);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;return success;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">bool moveLeft(uint16_t board[SIZE][SIZE]) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;bool success;</div><div class="code_line">&nbsp;&nbsp; &nbsp;rotateBoard(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp;success = moveUp(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp;rotateBoard(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp;rotateBoard(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp;rotateBoard(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp;return success;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">bool moveDown(uint16_t board[SIZE][SIZE]) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;bool success;</div><div class="code_line">&nbsp;&nbsp; &nbsp;rotateBoard(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp;rotateBoard(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp;success = moveUp(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp;rotateBoard(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp;rotateBoard(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp;return success;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">bool moveRight(uint16_t board[SIZE][SIZE]) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;bool success;</div><div class="code_line">&nbsp;&nbsp; &nbsp;rotateBoard(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp;rotateBoard(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp;rotateBoard(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp;success = moveUp(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp;rotateBoard(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp;return success;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">bool findPairDown(uint16_t board[SIZE][SIZE]) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;bool success = false;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int8_t x,y;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (x=0;x&#60;SIZE;x++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for (y=0;y&#60;SIZE-1;y++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (board[x][y]==board[x][y+1]) return true;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;return success;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int16_t countEmpty(uint16_t board[SIZE][SIZE]) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;int8_t x,y;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int16_t count=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (x=0;x&#60;SIZE;x++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for (y=0;y&#60;SIZE;y++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (board[x][y]==0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;count++;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;return count;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">bool gameEnded(uint16_t board[SIZE][SIZE]) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;bool ended = true;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (countEmpty(board)&#62;0) return false;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (findPairDown(board)) return false;</div><div class="code_line">&nbsp;&nbsp; &nbsp;rotateBoard(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (findPairDown(board)) ended = false;</div><div class="code_line">&nbsp;&nbsp; &nbsp;rotateBoard(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp;rotateBoard(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp;rotateBoard(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp;return ended;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void addRandom(uint16_t board[SIZE][SIZE]) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;static bool initialized = false;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int8_t x,y;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int16_t r,len=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;uint16_t n,list[SIZE*SIZE][2];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (!initialized) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;srand(time(NULL));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;initialized = true;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (x=0;x&#60;SIZE;x++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for (y=0;y&#60;SIZE;y++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (board[x][y]==0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;list[len][0]=x;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;list[len][1]=y;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;len++;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (len&#62;0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;r = rand()%len;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;x = list[r][0];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;y = list[r][1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;n = ((rand()%10)/9+1)*2;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;board[x][y]=n;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void setBufferedInput(bool enable) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;static bool enabled = true;</div><div class="code_line">&nbsp;&nbsp; &nbsp;static struct termios old;</div><div class="code_line">&nbsp;&nbsp; &nbsp;struct termios new;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (enable &amp;&amp; !enabled) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// restore the former settings</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;tcsetattr(STDIN_FILENO,TCSANOW,&amp;old);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// set the new state</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;enabled = true;</div><div class="code_line">&nbsp;&nbsp; &nbsp;} else if (!enable &amp;&amp; enabled) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// get the terminal settings for standard input</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;tcgetattr(STDIN_FILENO,&amp;new);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// we want to keep the old setting to restore them at the end</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;old = new;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// disable canonical mode (buffered i/o) and local echo</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;new.c_lflag &amp;=(~ICANON &amp; ~ECHO);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// set the new settings immediately</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;tcsetattr(STDIN_FILENO,TCSANOW,&amp;new);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// set the new state</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;enabled = false;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int test() {</div><div class="code_line">&nbsp;&nbsp; &nbsp;uint16_t array[SIZE];</div><div class="code_line">&nbsp;&nbsp; &nbsp;uint16_t data[] = {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;0,0,0,2, &nbsp; &nbsp;2,0,0,0,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;0,0,2,2, &nbsp; &nbsp;4,0,0,0,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;0,2,0,2, &nbsp; &nbsp;4,0,0,0,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;2,0,0,2, &nbsp; &nbsp;4,0,0,0,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;2,0,2,0, &nbsp; &nbsp;4,0,0,0,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;2,2,2,0, &nbsp; &nbsp;4,2,0,0,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;2,0,2,2, &nbsp; &nbsp;4,2,0,0,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;2,2,0,2, &nbsp; &nbsp;4,2,0,0,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;2,2,2,2, &nbsp; &nbsp;4,4,0,0,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;4,4,2,2, &nbsp; &nbsp;8,4,0,0,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;2,2,4,4, &nbsp; &nbsp;4,8,0,0,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;8,0,2,2, &nbsp; &nbsp;8,4,0,0,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;4,0,2,2, &nbsp; &nbsp;4,4,0,0</div><div class="code_line">&nbsp;&nbsp; &nbsp;};</div><div class="code_line">&nbsp;&nbsp; &nbsp;uint16_t *in,*out;</div><div class="code_line">&nbsp;&nbsp; &nbsp;uint16_t t,tests;</div><div class="code_line">&nbsp;&nbsp; &nbsp;uint8_t i;</div><div class="code_line">&nbsp;&nbsp; &nbsp;bool success = true;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;tests = (sizeof(data)/sizeof(data[0]))/(2*SIZE);</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (t=0;t&#60;tests;t++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;in = data+t*2*SIZE;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;out = in + SIZE;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for (i=0;i&#60;SIZE;i++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;array[i] = in[i];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;slideArray(array);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for (i=0;i&#60;SIZE;i++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (array[i] != out[i]) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;success = false;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (success==false) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for (i=0;i&#60;SIZE;i++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;%d &quot;,in[i]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;=&#62; &quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for (i=0;i&#60;SIZE;i++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;%d &quot;,array[i]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;expected &quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for (i=0;i&#60;SIZE;i++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;%d &quot;,in[i]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;=&#62; &quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for (i=0;i&#60;SIZE;i++) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;%d &quot;,out[i]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (success) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;All %u tests executed successfully\n&quot;,tests);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;return !success;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void signal_callback_handler(int signum) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot; &nbsp; &nbsp; &nbsp; &nbsp; TERMINATED &nbsp; &nbsp; &nbsp; &nbsp; \n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;setBufferedInput(true);</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;3[?25h&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;exit(signum);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int main(int argc, char *argv[]) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;uint16_t board[SIZE][SIZE];</div><div class="code_line">&nbsp;&nbsp; &nbsp;char c;</div><div class="code_line">&nbsp;&nbsp; &nbsp;bool success;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (argc == 2 &amp;&amp; strcmp(argv[1],&quot;test&quot;)==0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return test();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (argc == 2 &amp;&amp; strcmp(argv[1],&quot;blackwhite&quot;)==0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;scheme = 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (argc == 2 &amp;&amp; strcmp(argv[1],&quot;bluered&quot;)==0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;scheme = 2;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;3[?25l3[2J3[H&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// register signal handler for when ctrl-c is pressed</div><div class="code_line">&nbsp;&nbsp; &nbsp;signal(SIGINT, signal_callback_handler);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;memset(board,0,sizeof(board));</div><div class="code_line">&nbsp;&nbsp; &nbsp;addRandom(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp;addRandom(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp;drawBoard(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp;setBufferedInput(false);</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (true) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;c=getchar();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;switch(c) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case 97: &nbsp; &nbsp;// &#39;a&#39; key</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case 104: &nbsp; // &#39;h&#39; key</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case 68: &nbsp; &nbsp;// left arrow</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;success = moveLeft(board); &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case 100: &nbsp; // &#39;d&#39; key</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case 108: &nbsp; // &#39;l&#39; key</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case 67: &nbsp; &nbsp;// right arrow</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;success = moveRight(board); break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case 119: &nbsp; // &#39;w&#39; key</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case 107: &nbsp; // &#39;k&#39; key</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case 65: &nbsp; &nbsp;// up arrow</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;success = moveUp(board); &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case 115: &nbsp; // &#39;s&#39; key</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case 106: &nbsp; // &#39;j&#39; key</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;case 66: &nbsp; &nbsp;// down arrow</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;success = moveDown(board); &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;default: success = false;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (success) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;drawBoard(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;usleep(150000);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;addRandom(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;drawBoard(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (gameEnded(board)) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot; &nbsp; &nbsp; &nbsp; &nbsp; GAME OVER &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (c==&#39;q&#39;) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot; &nbsp; &nbsp; &nbsp; &nbsp;QUIT? (y/n) &nbsp; &nbsp; &nbsp; &nbsp; \n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while (true) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c=getchar();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (c==&#39;y&#39;){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;setBufferedInput(true);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot;3[?25h&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;exit(0);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;drawBoard(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (c==&#39;r&#39;) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;printf(&quot; &nbsp; &nbsp; &nbsp; RESTART? (y/n) &nbsp; &nbsp; &nbsp; \n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while (true) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c=getchar();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (c==&#39;y&#39;){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;memset(board,0,sizeof(board));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;addRandom(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;addRandom(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;drawBoard(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;drawBoard(board);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;setBufferedInput(true);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;printf(&quot;3[?25h&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return EXIT_SUCCESS;</div><div class="code_line">}</div></ol></div></div></div></div><br>
</div></div>]]></description>
        <author>SergeyIT</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=470204&amp;view=findpost&amp;p=3932816</guid>
        <pubDate>Fri, 05 Dec 2025 16:53:37 +0000</pubDate>
        <title>Недокументированные esacpe-последовательности &amp;#092;( &amp;#092;[ &amp;#092;{</title>
        <link>https://forum.sources.ru/index.php?showtopic=470204&amp;view=findpost&amp;p=3932816</link>
        <description><![CDATA[grgdvo: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=470204&view=findpost&p=3932729'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Majestio &#064; <time class="tag-quote__quoted-time" datetime="2025-12-04T12:52:41+00:00">04.12.25, 12:52</time></span><div class='quote '><strong class='tag-b'>grgdvo</strong>, ты скажи, в чём у тебя проблема?<br>
То, что мир несовершенен - мы и так знаем.</div></div><br>
Хочу разобраться, почему компилятор gcc не ругается на escape-последовательности &#092;{ &#092;( &#092;[, но при этом ругается на &#092;} &#092;) &#092;] ???<br>
Кто-то зачем-то так придумал... Зачем?? Почему??]]></description>
        <author>grgdvo</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=470204&amp;view=findpost&amp;p=3932730</guid>
        <pubDate>Thu, 04 Dec 2025 13:06:48 +0000</pubDate>
        <title>Недокументированные esacpe-последовательности &amp;#092;( &amp;#092;[ &amp;#092;{</title>
        <link>https://forum.sources.ru/index.php?showtopic=470204&amp;view=findpost&amp;p=3932730</link>
        <description><![CDATA[sharky72: Осадочек остался ;)]]></description>
        <author>sharky72</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=470204&amp;view=findpost&amp;p=3932729</guid>
        <pubDate>Thu, 04 Dec 2025 12:52:41 +0000</pubDate>
        <title>Недокументированные esacpe-последовательности &amp;#092;( &amp;#092;[ &amp;#092;{</title>
        <link>https://forum.sources.ru/index.php?showtopic=470204&amp;view=findpost&amp;p=3932729</link>
        <description><![CDATA[Majestio: <strong class='tag-b'>grgdvo</strong>, ты скажи, в чём у тебя проблема?<br>
То, что мир несовершенен - мы и так знаем.]]></description>
        <author>Majestio</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=470204&amp;view=findpost&amp;p=3932659</guid>
        <pubDate>Wed, 03 Dec 2025 21:37:06 +0000</pubDate>
        <title>Недокументированные esacpe-последовательности &amp;#092;( &amp;#092;[ &amp;#092;{</title>
        <link>https://forum.sources.ru/index.php?showtopic=470204&amp;view=findpost&amp;p=3932659</link>
        <description><![CDATA[grgdvo: Добрый день&#33;<br>
Недавно пришлось играться с escape-последовательностями. Обнаружил, что можно так<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;stdio.h&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">int main()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;printf(&quot;text {\{ text [\[ text (\( text \)) text \]] text \}} text\n&quot;);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">/*</div><div class="code_line">&nbsp;* minimal example: test.c</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* compile: cc test.c</div><div class="code_line">&nbsp;*</div><div class="code_line">&nbsp;* test.c: In function ‘main’:</div><div class="code_line">&nbsp;* test.c:5:72: warning: unknown escape sequence: &#39;\)&#39;</div><div class="code_line">&nbsp;* &nbsp; &nbsp; 5 | &nbsp; printf(&quot;text {\{ text [\[ text (\( text \)) text \]] text \}} text\n&quot;);</div><div class="code_line">&nbsp;* &nbsp; &nbsp; &nbsp; | &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;^</div><div class="code_line">&nbsp;* test.c:5:72: warning: unknown escape sequence: &#39;\]&#39;</div><div class="code_line">&nbsp;* test.c:5:72: warning: unknown escape sequence: &#39;\}&#39;</div><div class="code_line">&nbsp;*/</div></ol></div></div></div></div><br>
<br>
<strong class='tag-b'>Нигде не документировано, ПОЧЕМУ можно &#092;{ &#092;[ &#092;(, но нельзя &#092;} &#092;] &#092;) ??</strong><br>
Точнее, не то чтобы нельзя, выдается предупреждение. Код компилируется и все корректно выводится.<br>
<br>
Смотрел здесь - <a class='tag-url' href='https://www.cppreference.com/w/c/language/escape.html' target='_blank'>https://www.cppreference.com/w/c/language/escape.html</a>.<br>
<br>
Заглянул в стандарт (под рукой была версия 1999 года). Там это (6.4.4.4):<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">simple-escape-sequence: one of \&#39; \&quot; \? \ \a \b \f \n \r \t \v</div></ol></div></div></div></div><br>
<br>
Все объяснимо, всем известные escape-последовательности.<br>
<br>
А вот про &quot;открывающиеся скобки&quot; непонятно. Если кто-то знает ответ на вопрос, дайте знать, пожалуйста.<br>
Спасибо&#33;<br>
<br>
P.S.: Забыл добавить. <br>
Разумеется это что-то implementation-defined.<br>
У меня компилятор gcc-12.2 (on Debian 12).<br>
Поиск по мануалу gcc тоже ничего особенного не дал, за исключением, что добавились &#092;e и &#092;E как аналог ESC символа<br>
<a class='tag-url' href='https://gcc.gnu.org/onlinedocs/gcc/Character-Escapes.html' target='_blank'>https://gcc.gnu.org/onlinedocs/gcc/Character-Escapes.html</a>]]></description>
        <author>grgdvo</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	