home *** CD-ROM | disk | FTP | other *** search
/ vim.ftp.fu-berlin.de / 2015-02-03.vim.ftp.fu-berlin.de.tar / vim.ftp.fu-berlin.de / patches / 6.2.184 < prev    next >
Encoding:
Internet Message Format  |  2004-01-17  |  17.3 KB

  1. To: vim-dev@vim.org
  2. Subject: Patch 6.2.184
  3. Fcc: outbox
  4. From: Bram Moolenaar <Bram@moolenaar.net>
  5. Mime-Version: 1.0
  6. Content-Type: text/plain; charset=ISO-8859-1
  7. Content-Transfer-Encoding: 8bit
  8. ------------
  9.  
  10. Patch 6.2.184
  11. Problem:    With 'formatoptions' set to "1aw" inserting text may cause the
  12.         paragraph to be ended. (Alan Schmitt)
  13. Solution:   Temporarily add an extra space to make the paragraph continue
  14.         after moving the word after the cursor to the next line.
  15.         Also format when pressing Esc.
  16. Files:        src/edit.c, src/normal.c, src/proto/edit.pro
  17.  
  18.  
  19. *** ../vim-6.2.183/src/edit.c    Sun Nov  9 20:26:53 2003
  20. --- src/edit.c    Sun Jan 18 20:23:49 2004
  21. ***************
  22. *** 121,132 ****
  23.   static void ins_ctrl_v __ARGS((void));
  24.   static void undisplay_dollar __ARGS((void));
  25.   static void insert_special __ARGS((int, int, int));
  26.   #ifdef FEAT_COMMENTS
  27.   static int  cmplen __ARGS((char_u *s1, char_u *s2));
  28.   #endif
  29.   static void redo_literal __ARGS((int c));
  30.   static void start_arrow __ARGS((pos_T *end_insert_pos));
  31. ! static void stop_insert __ARGS((pos_T *end_insert_pos));
  32.   static int  echeck_abbr __ARGS((int));
  33.   static void replace_push_off __ARGS((int c));
  34.   static int  replace_pop __ARGS((void));
  35. --- 121,133 ----
  36.   static void ins_ctrl_v __ARGS((void));
  37.   static void undisplay_dollar __ARGS((void));
  38.   static void insert_special __ARGS((int, int, int));
  39. + static void check_auto_format __ARGS((int));
  40.   #ifdef FEAT_COMMENTS
  41.   static int  cmplen __ARGS((char_u *s1, char_u *s2));
  42.   #endif
  43.   static void redo_literal __ARGS((int c));
  44.   static void start_arrow __ARGS((pos_T *end_insert_pos));
  45. ! static void stop_insert __ARGS((pos_T *end_insert_pos, int esc));
  46.   static int  echeck_abbr __ARGS((int));
  47.   static void replace_push_off __ARGS((int c));
  48.   static int  replace_pop __ARGS((void));
  49. ***************
  50. *** 195,204 ****
  51.   static int    old_indent = 0;        /* for ^^D command in insert mode */
  52.   
  53.   #ifdef FEAT_RIGHTLEFT
  54. ! int        revins_on;            /* reverse insert mode on */
  55. ! int        revins_chars;        /* how much to skip after edit */
  56. ! int        revins_legal;        /* was the last char 'legal'? */
  57. ! int        revins_scol;        /* start column of revins session */
  58.   #endif
  59.   
  60.   #if defined(FEAT_MBYTE) && defined(MACOS_CLASSIC)
  61. --- 196,205 ----
  62.   static int    old_indent = 0;        /* for ^^D command in insert mode */
  63.   
  64.   #ifdef FEAT_RIGHTLEFT
  65. ! int        revins_on;        /* reverse insert mode on */
  66. ! int        revins_chars;        /* how much to skip after edit */
  67. ! int        revins_legal;        /* was the last char 'legal'? */
  68. ! int        revins_scol;        /* start column of revins session */
  69.   #endif
  70.   
  71.   #if defined(FEAT_MBYTE) && defined(MACOS_CLASSIC)
  72. ***************
  73. *** 209,214 ****
  74. --- 210,218 ----
  75.                          char.  Set when edit() is called.
  76.                          after that arrow_used is used. */
  77.   
  78. + static int    did_add_space = FALSE;    /* auto_format() added an extra space
  79. +                        under the cursor */
  80.   /*
  81.    * edit(): Start inserting text.
  82.    *
  83. ***************
  84. *** 866,872 ****
  85.       /* insert the contents of a register */
  86.       case Ctrl_R:
  87.           ins_reg();
  88. !         auto_format();
  89.           inserted_space = FALSE;
  90.           break;
  91.   
  92. --- 870,876 ----
  93.       /* insert the contents of a register */
  94.       case Ctrl_R:
  95.           ins_reg();
  96. !         auto_format(FALSE);
  97.           inserted_space = FALSE;
  98.           break;
  99.   
  100. ***************
  101. *** 961,967 ****
  102.           }
  103.   # endif
  104.           ins_shift(c, lastc);
  105. !         auto_format();
  106.           inserted_space = FALSE;
  107.           break;
  108.   
  109. --- 965,971 ----
  110.           }
  111.   # endif
  112.           ins_shift(c, lastc);
  113. !         auto_format(FALSE);
  114.           inserted_space = FALSE;
  115.           break;
  116.   
  117. ***************
  118. *** 969,994 ****
  119.       case K_DEL:
  120.       case K_KDEL:
  121.           ins_del();
  122. !         auto_format();
  123.           break;
  124.   
  125.       /* delete character before the cursor */
  126.       case K_BS:
  127.       case Ctrl_H:
  128.           did_backspace = ins_bs(c, BACKSPACE_CHAR, &inserted_space);
  129. !         auto_format();
  130.           break;
  131.   
  132.       /* delete word before the cursor */
  133.       case Ctrl_W:
  134.           did_backspace = ins_bs(c, BACKSPACE_WORD, &inserted_space);
  135. !         auto_format();
  136.           break;
  137.   
  138.       /* delete all inserted text in current line */
  139.       case Ctrl_U:
  140.           did_backspace = ins_bs(c, BACKSPACE_LINE, &inserted_space);
  141. !         auto_format();
  142.           inserted_space = FALSE;
  143.           break;
  144.   
  145. --- 973,998 ----
  146.       case K_DEL:
  147.       case K_KDEL:
  148.           ins_del();
  149. !         auto_format(FALSE);
  150.           break;
  151.   
  152.       /* delete character before the cursor */
  153.       case K_BS:
  154.       case Ctrl_H:
  155.           did_backspace = ins_bs(c, BACKSPACE_CHAR, &inserted_space);
  156. !         auto_format(FALSE);
  157.           break;
  158.   
  159.       /* delete word before the cursor */
  160.       case Ctrl_W:
  161.           did_backspace = ins_bs(c, BACKSPACE_WORD, &inserted_space);
  162. !         auto_format(FALSE);
  163.           break;
  164.   
  165.       /* delete all inserted text in current line */
  166.       case Ctrl_U:
  167.           did_backspace = ins_bs(c, BACKSPACE_LINE, &inserted_space);
  168. !         auto_format(FALSE);
  169.           inserted_space = FALSE;
  170.           break;
  171.   
  172. ***************
  173. *** 1111,1117 ****
  174.           inserted_space = FALSE;
  175.           if (ins_tab())
  176.           goto normalchar;    /* insert TAB as a normal char */
  177. !         auto_format();
  178.           break;
  179.   
  180.       case K_KENTER:
  181. --- 1115,1121 ----
  182.           inserted_space = FALSE;
  183.           if (ins_tab())
  184.           goto normalchar;    /* insert TAB as a normal char */
  185. !         auto_format(FALSE);
  186.           break;
  187.   
  188.       case K_KENTER:
  189. ***************
  190. *** 1138,1144 ****
  191.   #endif
  192.           if (ins_eol(c) && !p_im)
  193.           goto doESCkey;        /* out of memory */
  194. !         auto_format();
  195.           inserted_space = FALSE;
  196.           break;
  197.   
  198. --- 1142,1148 ----
  199.   #endif
  200.           if (ins_eol(c) && !p_im)
  201.           goto doESCkey;        /* out of memory */
  202. !         auto_format(FALSE);
  203.           inserted_space = FALSE;
  204.           break;
  205.   
  206. ***************
  207. *** 1252,1258 ****
  208.               revins_legal++;
  209.   #endif
  210.               c = Ctrl_V;    /* pretend CTRL-V is last character */
  211. !             auto_format();
  212.           }
  213.           }
  214.           break;
  215. --- 1256,1262 ----
  216.               revins_legal++;
  217.   #endif
  218.               c = Ctrl_V;    /* pretend CTRL-V is last character */
  219. !             auto_format(FALSE);
  220.           }
  221.           }
  222.           break;
  223. ***************
  224. *** 1299,1305 ****
  225.   #endif
  226.           }
  227.   
  228. !         auto_format();
  229.   
  230.   #ifdef FEAT_FOLDING
  231.           /* When inserting a character the cursor line must never be in a
  232. --- 1303,1309 ----
  233.   #endif
  234.           }
  235.   
  236. !         auto_format(FALSE);
  237.   
  238.   #ifdef FEAT_FOLDING
  239.           /* When inserting a character the cursor line must never be in a
  240. ***************
  241. *** 2489,2495 ****
  242.           curwin->w_cursor.col++;
  243.           }
  244.   
  245. !         auto_format();
  246.   
  247.           ins_compl_free();
  248.           started_completion = FALSE;
  249. --- 2504,2510 ----
  250.           curwin->w_cursor.col++;
  251.           }
  252.   
  253. !         auto_format(FALSE);
  254.   
  255.           ins_compl_free();
  256.           started_completion = FALSE;
  257. ***************
  258. *** 4346,4357 ****
  259.    * saved here.
  260.    */
  261.       void
  262. ! auto_format()
  263.   {
  264.       pos_T    pos;
  265.       colnr_T    len;
  266.       char_u    *old, *pold;
  267.       char_u    *new, *pnew;
  268.   
  269.       if (!has_format_option(FO_AUTO))
  270.       return;
  271. --- 4361,4374 ----
  272.    * saved here.
  273.    */
  274.       void
  275. ! auto_format(trailblank)
  276. !     int        trailblank;    /* when TRUE also format with trailing blank */
  277.   {
  278.       pos_T    pos;
  279.       colnr_T    len;
  280.       char_u    *old, *pold;
  281.       char_u    *new, *pnew;
  282. +     int        wasatend;
  283.   
  284.       if (!has_format_option(FO_AUTO))
  285.       return;
  286. ***************
  287. *** 4359,4370 ****
  288.       pos = curwin->w_cursor;
  289.       old = ml_get_curline();
  290.   
  291.       /* Don't format in Insert mode when the cursor is on a trailing blank, the
  292.        * user might insert normal text next.  Also skip formatting when "1" is
  293.        * in 'formatoptions' and there is a single character before the cursor.
  294.        * Otherwise the line would be broken and when typing another non-white
  295.        * next they are not joined back together. */
  296. !     if (*old != NUL && pos.col == STRLEN(old))
  297.       {
  298.       dec_cursor();
  299.       if (!WHITECHAR(gchar_cursor())
  300. --- 4376,4391 ----
  301.       pos = curwin->w_cursor;
  302.       old = ml_get_curline();
  303.   
  304. +     /* may remove added space */
  305. +     check_auto_format(FALSE);
  306.       /* Don't format in Insert mode when the cursor is on a trailing blank, the
  307.        * user might insert normal text next.  Also skip formatting when "1" is
  308.        * in 'formatoptions' and there is a single character before the cursor.
  309.        * Otherwise the line would be broken and when typing another non-white
  310.        * next they are not joined back together. */
  311. !     wasatend = (pos.col == STRLEN(old));
  312. !     if (*old != NUL && !trailblank && wasatend)
  313.       {
  314.       dec_cursor();
  315.       if (!WHITECHAR(gchar_cursor())
  316. ***************
  317. *** 4426,4432 ****
  318.       len = (colnr_T)STRLEN(pnew);
  319.       if ((pold - old) + len >= pos.col)
  320.       {
  321. !         curwin->w_cursor.col = pos.col - (pold - old) + (pnew - new);
  322.           break;
  323.       }
  324.       /* Cursor wraps to next line */
  325. --- 4447,4477 ----
  326.       len = (colnr_T)STRLEN(pnew);
  327.       if ((pold - old) + len >= pos.col)
  328.       {
  329. !         if (pos.col <= (colnr_T)(pold - old))
  330. !         curwin->w_cursor.col = (pnew - new);
  331. !         else
  332. !         curwin->w_cursor.col = pos.col - (pold - old) + (pnew - new);
  333. !         /* Insert mode: If the cursor is now after the end of the line
  334. !          * while it previously wasn't, the line was broken.  Because of
  335. !          * the rule above we need to add a space when 'w' is in
  336. !          * 'formatoptions' to keep a paragraph formatted. */
  337. !         if (!wasatend && has_format_option(FO_WHITE_PAR))
  338. !         {
  339. !         len = STRLEN(new);
  340. !         if (curwin->w_cursor.col == len)
  341. !         {
  342. !             pnew = vim_strnsave(new, len + 2);
  343. !             pnew[len] = ' ';
  344. !             pnew[len + 1] = NUL;
  345. !             ml_replace(curwin->w_cursor.lnum, pnew, FALSE);
  346. !             /* remove the space later */
  347. !             did_add_space = TRUE;
  348. !         }
  349. !         else
  350. !             /* may remove added space */
  351. !             check_auto_format(FALSE);
  352. !         }
  353.           break;
  354.       }
  355.       /* Cursor wraps to next line */
  356. ***************
  357. *** 4437,4442 ****
  358. --- 4482,4521 ----
  359.       vim_free(old);
  360.   }
  361.   
  362. + /*
  363. +  * When an extra space was added to continue a paragraph for auto-formatting,
  364. +  * delete it now.  The space must be under the cursor, just after the insert
  365. +  * position.
  366. +  */
  367. +     static void
  368. + check_auto_format(end_insert)
  369. +     int        end_insert;        /* TRUE when ending Insert mode */
  370. + {
  371. +     int        c = ' ';
  372. +     if (did_add_space)
  373. +     {
  374. +     if (!WHITECHAR(gchar_cursor()))
  375. +         /* Somehow the space was removed already. */
  376. +         did_add_space = FALSE;
  377. +     else
  378. +     {
  379. +         if (!end_insert)
  380. +         {
  381. +         inc_cursor();
  382. +         c = gchar_cursor();
  383. +         dec_cursor();
  384. +         }
  385. +         if (c != NUL)
  386. +         {
  387. +         /* The space is no longer at the end of the line, delete it. */
  388. +         del_char(FALSE);
  389. +         did_add_space = FALSE;
  390. +         }
  391. +     }
  392. +     }
  393. + }
  394.   #ifdef FEAT_COMMENTS
  395.   /*
  396.    * Return the number of bytes for which strings "s1" and "s2" are equal.
  397. ***************
  398. *** 4536,4543 ****
  399.       if (!arrow_used)        /* something has been inserted */
  400.       {
  401.       AppendToRedobuff(ESC_STR);
  402.       arrow_used = TRUE;    /* this means we stopped the current insert */
  403. -     stop_insert(end_insert_pos);
  404.       }
  405.   }
  406.   
  407. --- 4615,4622 ----
  408.       if (!arrow_used)        /* something has been inserted */
  409.       {
  410.       AppendToRedobuff(ESC_STR);
  411. +     stop_insert(end_insert_pos, FALSE);
  412.       arrow_used = TRUE;    /* this means we stopped the current insert */
  413.       }
  414.   }
  415.   
  416. ***************
  417. *** 4587,4594 ****
  418.    * do a few things to stop inserting
  419.    */
  420.       static void
  421. ! stop_insert(end_insert_pos)
  422.       pos_T    *end_insert_pos;    /* where insert ended */
  423.   {
  424.       int        cc;
  425.   
  426. --- 4666,4674 ----
  427.    * do a few things to stop inserting
  428.    */
  429.       static void
  430. ! stop_insert(end_insert_pos, esc)
  431.       pos_T    *end_insert_pos;    /* where insert ended */
  432. +     int        esc;        /* called by ins_esc() */
  433.   {
  434.       int        cc;
  435.   
  436. ***************
  437. *** 4602,4635 ****
  438.       last_insert = get_inserted();
  439.       last_insert_skip = new_insert_skip;
  440.   
  441. !     /*
  442. !      * If we just did an auto-indent, remove the white space from the end of
  443. !      * the line, and put the cursor back.
  444. !      */
  445. !     if (did_ai && !arrow_used)
  446.       {
  447. !     if (gchar_cursor() == NUL && curwin->w_cursor.col > 0)
  448. !         --curwin->w_cursor.col;
  449. !     while (cc = gchar_cursor(), vim_iswhite(cc))
  450. !         (void)del_char(TRUE);
  451. !     if (cc != NUL)
  452. !         ++curwin->w_cursor.col;    /* put cursor back on the NUL */
  453.   
  454.   #ifdef FEAT_VISUAL
  455. !     /* <C-S-Right> may have started Visual mode, adjust the position for
  456. !      * deleted characters. */
  457. !     if (VIsual_active && VIsual.lnum == curwin->w_cursor.lnum)
  458. !     {
  459. !         cc = STRLEN(ml_get_curline());
  460. !         if (VIsual.col > (colnr_T)cc)
  461.           {
  462. !         VIsual.col = cc;
  463.   # ifdef FEAT_VIRTUALEDIT
  464. !         VIsual.coladd = 0;
  465.   # endif
  466.           }
  467. -     }
  468.   #endif
  469.       }
  470.       did_ai = FALSE;
  471.   #ifdef FEAT_SMARTINDENT
  472. --- 4682,4726 ----
  473.       last_insert = get_inserted();
  474.       last_insert_skip = new_insert_skip;
  475.   
  476. !     if (!arrow_used)
  477.       {
  478. !     /* Auto-format now.  It may seem strange to do this when stopping an
  479. !      * insertion (or moving the cursor), but it's required when appending
  480. !      * a line and having it end in a space.  But only do it when something
  481. !      * was actually inserted, otherwise undo won't work. */
  482. !     if (!ins_need_undo)
  483. !         auto_format(TRUE);
  484. !     /* If a space was inserted for auto-formatting, remove it now. */
  485. !     check_auto_format(TRUE);
  486. !     /* If we just did an auto-indent, remove the white space from the end
  487. !      * of the line, and put the cursor back.  */
  488. !     if (did_ai && esc)
  489. !     {
  490. !         if (gchar_cursor() == NUL && curwin->w_cursor.col > 0)
  491. !         --curwin->w_cursor.col;
  492. !         while (cc = gchar_cursor(), vim_iswhite(cc))
  493. !         (void)del_char(TRUE);
  494. !         if (cc != NUL)
  495. !         ++curwin->w_cursor.col;    /* put cursor back on the NUL */
  496.   
  497.   #ifdef FEAT_VISUAL
  498. !         /* <C-S-Right> may have started Visual mode, adjust the position for
  499. !          * deleted characters. */
  500. !         if (VIsual_active && VIsual.lnum == curwin->w_cursor.lnum)
  501.           {
  502. !         cc = STRLEN(ml_get_curline());
  503. !         if (VIsual.col > (colnr_T)cc)
  504. !         {
  505. !             VIsual.col = cc;
  506.   # ifdef FEAT_VIRTUALEDIT
  507. !             VIsual.coladd = 0;
  508.   # endif
  509. +         }
  510.           }
  511.   #endif
  512. +     }
  513.       }
  514.       did_ai = FALSE;
  515.   #ifdef FEAT_SMARTINDENT
  516. ***************
  517. *** 5988,5994 ****
  518.           disabled_redraw = TRUE;
  519.           return FALSE;    /* repeat the insert */
  520.       }
  521. !     stop_insert(&curwin->w_cursor);
  522.       undisplay_dollar();
  523.       }
  524.   
  525. --- 6079,6085 ----
  526.           disabled_redraw = TRUE;
  527.           return FALSE;    /* repeat the insert */
  528.       }
  529. !     stop_insert(&curwin->w_cursor, TRUE);
  530.       undisplay_dollar();
  531.       }
  532.   
  533. *** ../vim-6.2.183/src/normal.c    Sun Jan 18 20:17:41 2004
  534. --- src/normal.c    Sun Jan 18 18:49:04 2004
  535. ***************
  536. *** 1753,1759 ****
  537.               oap->is_VIsual ? (int)cap->count1 :
  538.   #endif
  539.               1);
  540. !         auto_format();
  541.           break;
  542.   
  543.       case OP_JOIN_NS:
  544. --- 1753,1759 ----
  545.               oap->is_VIsual ? (int)cap->count1 :
  546.   #endif
  547.               1);
  548. !         auto_format(FALSE);
  549.           break;
  550.   
  551.       case OP_JOIN_NS:
  552. ***************
  553. *** 1766,1772 ****
  554.           else
  555.           {
  556.           do_do_join(oap->line_count, oap->op_type == OP_JOIN);
  557. !         auto_format();
  558.           }
  559.           break;
  560.   
  561. --- 1766,1772 ----
  562.           else
  563.           {
  564.           do_do_join(oap->line_count, oap->op_type == OP_JOIN);
  565. !         auto_format(FALSE);
  566.           }
  567.           break;
  568.   
  569. ***************
  570. *** 1781,1787 ****
  571.           (void)op_delete(oap);
  572.           if (oap->motion_type == MLINE && has_format_option(FO_AUTO))
  573.               u_save_cursor();        /* cursor line wasn't saved yet */
  574. !         auto_format();
  575.           }
  576.           break;
  577.   
  578. --- 1781,1787 ----
  579.           (void)op_delete(oap);
  580.           if (oap->motion_type == MLINE && has_format_option(FO_AUTO))
  581.               u_save_cursor();        /* cursor line wasn't saved yet */
  582. !         auto_format(FALSE);
  583.           }
  584.           break;
  585.   
  586. ***************
  587. *** 1896,1902 ****
  588.   
  589.           /* TODO: when inserting in several lines, should format all
  590.            * the lines. */
  591. !         auto_format();
  592.   
  593.           if (restart_edit == 0)
  594.               restart_edit = restart_edit_save;
  595. --- 1896,1902 ----
  596.   
  597.           /* TODO: when inserting in several lines, should format all
  598.            * the lines. */
  599. !         auto_format(FALSE);
  600.   
  601.           if (restart_edit == 0)
  602.               restart_edit = restart_edit_save;
  603. ***************
  604. *** 8193,8199 ****
  605.       if (reg2 != NULL)
  606.           put_register(regname, reg2);
  607.   #endif
  608. !     auto_format();
  609.       }
  610.   }
  611.   
  612. --- 8205,8211 ----
  613.       if (reg2 != NULL)
  614.           put_register(regname, reg2);
  615.   #endif
  616. !     auto_format(FALSE);
  617.       }
  618.   }
  619.   
  620. *** ../vim-6.2.183/src/proto/edit.pro    Sun Jun  1 12:26:07 2003
  621. --- src/proto/edit.pro    Thu Jan 15 20:57:54 2004
  622. ***************
  623. *** 13,19 ****
  624.   void ins_compl_check_keys __ARGS((void));
  625.   int get_literal __ARGS((void));
  626.   void insertchar __ARGS((int c, int flags, int second_indent));
  627. ! void auto_format __ARGS((void));
  628.   int comp_textwidth __ARGS((int ff));
  629.   int stop_arrow __ARGS((void));
  630.   void set_last_insert __ARGS((int c));
  631. --- 13,19 ----
  632.   void ins_compl_check_keys __ARGS((void));
  633.   int get_literal __ARGS((void));
  634.   void insertchar __ARGS((int c, int flags, int second_indent));
  635. ! void auto_format __ARGS((int trailblank));
  636.   int comp_textwidth __ARGS((int ff));
  637.   int stop_arrow __ARGS((void));
  638.   void set_last_insert __ARGS((int c));
  639. *** ../vim-6.2.183/src/version.c    Sun Jan 18 20:17:41 2004
  640. --- src/version.c    Sun Jan 18 20:19:10 2004
  641. ***************
  642. *** 639,640 ****
  643. --- 639,642 ----
  644.   {   /* Add new patch number below this line */
  645. + /**/
  646. +     184,
  647.   /**/
  648.  
  649. -- 
  650.     [clop clop]
  651. MORTICIAN:  Who's that then?
  652. CUSTOMER:   I don't know.
  653. MORTICIAN:  Must be a king.
  654. CUSTOMER:   Why?
  655. MORTICIAN:  He hasn't got shit all over him.
  656.                                   The Quest for the Holy Grail (Monty Python)
  657.  
  658.  /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
  659. ///        Sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
  660. \\\              Project leader for A-A-P -- http://www.A-A-P.org        ///
  661.  \\\  Help AIDS victims, buy here: http://ICCF-Holland.org/click1.html  ///
  662.