home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / games / volume13 / dominion / part21 / c_news.c next >
C/C++ Source or Header  |  1992-02-11  |  19KB  |  743 lines

  1. /* c_news.c : Curses routines for the news subsystem of Dominion */
  2. /*
  3.  * Copyright (C) 1990 Free Software Foundation, Inc.
  4.  * Written by the dominion project.
  5.  *
  6.  * This file is part of dominion.
  7.  *
  8.  * dominion is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU General Public License as published
  10.  * by the Free Software Foundation; either version 1, or (at your option)
  11.  * any later version.
  12.  *
  13.  * This software is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU General Public License
  19.  * along with this software; see the file COPYING.  If not, write to
  20.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  */
  22.  
  23. #include "dominion.h"
  24. #include "news.h"
  25. #include <stdio.h>
  26. #ifdef SYSV
  27. #include <string.h>
  28. #else
  29. #include <strings.h>
  30. #endif
  31. #include <ctype.h>
  32.  
  33. extern Suser user;        /* The current user. Used for names. */
  34. extern Sworld world;        /* The current world. Used for the thon. num.*/
  35.  
  36. extern s_group *group_find();    /* In news.c. Searches a database for a 
  37.                  specified group. */
  38.  
  39. int first_unread(art_arr,g_choice)
  40. s_article **art_arr;
  41. s_group *g_choice;
  42. {
  43.   int loop,ret;
  44.  
  45.   ret=g_choice->last;
  46.   if (g_choice->first <= g_choice->last)
  47.     for(loop=g_choice->first;((loop<=g_choice->last)&&(ret==g_choice->last))
  48.     ;loop++)
  49.       if (!(art_arr[loop-g_choice->first]->read))
  50.     ret=loop;
  51.   return(ret);
  52. } /* first_unread */
  53.  
  54.  
  55. write_newsrc(art_arr, g_choice)
  56. s_article **art_arr;
  57. s_group *g_choice;
  58. {
  59.   FILE *nr_fp,*tmp_fp;
  60.   char nr_fn[100],tmp_fn[100];
  61.   char input[300],output[300],cmd[100],group_name[100];
  62.   int art_pnt;
  63.  
  64.   if ((g_choice->first)>(g_choice->last))
  65.     return;
  66.   sprintf(nr_fn,"%s/.newsrc.%d",NEWS_DIR,user.id);
  67.   sprintf(tmp_fn,"%s/.tmprc.%d",NEWS_DIR,user.id);
  68.   nr_fp=fopen(nr_fn,"r");
  69.   tmp_fp=fopen(tmp_fn,"w");
  70.   if (tmp_fp==NULL)
  71.     {
  72.       fprintf(stderr,"Could not open temp. file to save read article list\n");
  73.       fflush(stderr);
  74.       fclose(nr_fp);
  75.       fclose(tmp_fp);
  76.     }
  77.   else
  78.     {
  79.       if (nr_fp!=NULL)
  80. /*    while((fscanf(nr_fp,"%[^\n]",input))!=EOF)*/
  81.     while ((fgets(input,300,nr_fp))!=NULL)
  82.       {
  83.         sscanf(input,"%s",group_name);
  84.         if (strcmp(group_name,g_choice->name))
  85.           fprintf(tmp_fp,"%s",input);
  86.       }
  87.       fprintf(tmp_fp,"%s ",g_choice->name);
  88.       art_pnt=g_choice->first;
  89.       while(art_pnt<=g_choice->last)
  90.     {
  91.       if (!(art_arr[art_pnt-g_choice->first]->read))
  92.         art_pnt++;
  93.       else
  94.         if ((art_pnt<g_choice->last)&&
  95.         (art_arr[art_pnt+1-g_choice->first]->read))
  96.           {
  97.         fprintf(tmp_fp,"%d-",art_pnt);
  98.         while((art_pnt<g_choice->last)&&
  99.               (art_arr[art_pnt+1-g_choice->first]->read))
  100.           art_pnt++;
  101.         fprintf(tmp_fp,"%d ",art_pnt);
  102.         art_pnt++;
  103.           }
  104.         else
  105.           {
  106.         fprintf(tmp_fp,"%d ",art_pnt);
  107.         art_pnt++;
  108.           }
  109.     } /* while art_pnt <= gchoice->last */
  110.       fprintf(tmp_fp,"\n");
  111.       fclose(tmp_fp);
  112.       fclose(nr_fp);
  113.       sprintf(cmd,"rm -f %s",nr_fn);
  114.       system(cmd);
  115.       sprintf(cmd,"cp %s %s",tmp_fn,nr_fn);
  116.       system(cmd);
  117.       sprintf(cmd,"rm -f %s",tmp_fn);
  118.       system(cmd);
  119.     } /* else */
  120. } /* write_newsrc */
  121.  
  122. read_newsrc(art_arr,g_choice)
  123. s_article **art_arr;
  124. s_group *g_choice;
  125. {
  126.   FILE *nr_fp;
  127.   char nr_fn[100],input[300],group_name[100],*in_ptr;
  128.   int art_num,art_pnt,first_art,last_art;
  129.  
  130.   sprintf(nr_fn,"%s/.newsrc.%d",NEWS_DIR,user.id);
  131.   nr_fp=fopen(nr_fn,"r");
  132.   if (nr_fp!=NULL)
  133.     {
  134.       while ((fgets(input,300,nr_fp))!=NULL)
  135.     {
  136.       sscanf(input,"%s",group_name);
  137.       if (!strcmp(group_name,g_choice->name))
  138.         {
  139.           in_ptr=strchr(input,(int)' ');
  140.           if (in_ptr!=NULL)
  141.         in_ptr++;
  142.           while (*in_ptr!='\0')
  143.         {
  144.           sscanf(in_ptr,"%d",&first_art);
  145.           while (isdigit(*in_ptr))
  146.             in_ptr++;
  147.           if (*in_ptr=='-')
  148.             {
  149.               sscanf(in_ptr+1,"%d",&last_art);
  150.               in_ptr=strchr(in_ptr,(int)(' '));
  151.             }
  152.           else
  153.             {
  154.               last_art=first_art;
  155.               in_ptr++;
  156.             }
  157.           for (art_num=first_art;art_num<=last_art;art_num++)
  158.             if ((art_num<=g_choice->last)&&(art_num>=g_choice->first))
  159.               (art_arr[art_num-g_choice->first]->read)=1;
  160.         } /* while *in_ptr */
  161.         } /* if !strcmp */
  162.     } /* while */
  163.     } /* if nr_fp */
  164.   fclose(nr_fp);
  165. } /* read_newsrc */
  166.  
  167. art_menu_bottom(menu_lines)
  168. int menu_lines;
  169. {
  170.   mvaddstr(menu_lines+2,5,"Position arrow with [j]/[2] (down) and [k]/[8] (up)");
  171.   mvaddstr((menu_lines+3),5,"RETURN to Read, Q to Quit    (Use SHIFT to jump by page)");
  172.   mvaddstr(menu_lines+4,1,"(*'s indicate previously read - [r]/[u] to mark as read/unread)");
  173. }
  174.  
  175.  
  176. /* This function displays a portion (or the whole) of the menu of articles
  177.    that can be read. The menu is displayed according to where the cursor is
  178.    and where it's pointing to. (and of course the size of the screen) */
  179.  
  180. show_art_menu(art_arr,menu_lines,cur_point,cur_pos,first_art,last_art)
  181.      s_article **art_arr;
  182.      /* This is an array of pointers to "article structures". See news.h */
  183.      int menu_lines,cur_point,cur_pos,first_art,last_art;
  184.      /* menu_lines: how many lines can be displayed on the screen
  185.     cur_point: which article the cursor is pointing to
  186.     cur_pos: where on the screen the cursor is
  187.     first_art: the first article of all the articles that can be read
  188.     last_art: the last article....
  189.     */
  190. {
  191.   int line,art_no; /* line: what line on the display we're showing.
  192.               art_no: What article this is we're showing. */
  193.   char fmt[50],out[200]; /* fmt: How to format the output strings (sprintf).
  194.                 out: The output string for the menu. */
  195.  
  196.   sprintf(fmt,"%%4d> %%-9.9s  %%-%d.%ds %%-%d.%ds",NAMELEN,
  197.       NAMELEN,(COLS-23-NAMELEN),(COLS-23-NAMELEN)); 
  198.   /* fmt is how the menu lines look. It's used to handle variable width screens
  199.      4 characters for the article number, a >, 16 characters for the thon,
  200.      NAMELEN characters for the sender, and the rest for the subject. */
  201.   for(line=1;line <= menu_lines;line++)
  202.     {
  203.       art_no=(cur_point-cur_pos)+line; /* Took a while to figure out. I 
  204.                     think it's right though. */
  205.       if (art_no <= last_art)    /* Don't display articles past the end.  */
  206.     {
  207.       sprintf(out,fmt,art_no,art_arr[art_no-first_art]->date,
  208.           art_arr[art_no-first_art]->sender,
  209.           art_arr[art_no-first_art]->subject); /* Print to the string*/
  210.       mvaddstr(line,4,out);    /* Show the string. */
  211.       if ((art_arr[art_no-first_art]->read)==1)
  212.         mvaddstr(line,5,"*");
  213.     } /* if (art_no <= last_art */
  214.     } /* for line=1... */
  215. } /* show_art_menu */
  216.  
  217.  
  218. /* This function is used for reading news articles. The user has selected a
  219.    group to read (pointed to by g_choice). This displays a menu of the articles
  220.    and allows the user to display articles from the menu. */
  221.  
  222. news_arts_menu(g_choice,turn)
  223. s_group *g_choice;        /* This is the group to read from */
  224. int turn;            /* What thon is this? For positioning the
  225.                  cursor. */
  226. {
  227.   char news_dir[100], g_dir[100], a_fn[100], cmd[100];
  228.     /* news_dir: the main news directory. g_dir: this group's directory.
  229.        a_fn: The file name of an article. cmd: the 'system' command
  230.        to view arts. */
  231.   char text[100],type[10];
  232.     /* , date, from: The header of the articles. 
  233.      type what type line of the header? */
  234.   char this_thon[20]; /* What thon it is in string format. */
  235.   FILE *a_fp; /* The file pointer to an article file. */
  236.   int loop;   /* To loop through the articles. */
  237.   char c;     /* The key the user presses. */
  238.   s_article **art_arr,*a_temp;    /* art_arr: An array of pointers to
  239.                             'article' structures.
  240.                    a_temp: A work pointer. */
  241.   int menu_lines,menu_center,cur_pos,cur_point,done;
  242.   int show_next = 0;    /* should we see the next article immediately? */
  243.     /* menu_lines: How many lines can be shown.
  244.        menu_center: What line is the center line.
  245.        cur_pos: Where on the screen is the cursor.
  246.        cur_point: What article is it pointing to.
  247.        done: Can we leave news? */
  248.   if((g_choice->first)<=(g_choice->last))
  249.     art_arr=(s_article **)malloc(sizeof(s_article *)*(g_choice->last-
  250.                               g_choice->first+1));
  251.        /* Allocate space for the array. */
  252.   else
  253.     art_arr=NULL;
  254.   sprintf(this_thon,"Thon %d",turn);  
  255.   sprintf(news_dir,"%s",NEWS_DIR);
  256.   sprintf(g_dir,"%s/%s",news_dir,g_choice->name);
  257.   clear();
  258.   for(loop=g_choice->first;loop<=g_choice->last;loop++)
  259.     {
  260.       a_temp=(s_article *)malloc(sizeof(s_article));
  261.       a_temp->read=0;
  262.       sprintf(a_fn,"%s/%d",g_dir,loop);
  263.       a_fp=fopen(a_fn,"r");
  264.       if (a_fp!=NULL)
  265.     {
  266.       strcpy(a_temp->subject,"");
  267.       while (!strcmp(a_temp->subject,""))
  268.         {
  269.           fscanf(a_fp,"%s",type);
  270.           if (!strcmp(type,"Date:"))
  271.         {
  272.           fscanf(a_fp,"%[^\n]",text);
  273.           strcpy(a_temp->date,text);
  274.         }
  275.           if (!strcmp(type,"From:"))
  276.         {
  277.           fscanf(a_fp,"%[^\n]",text);
  278.           strcpy(a_temp->sender,text);
  279.         }
  280.           if (!strcmp(type,"Author:"))
  281.         {
  282.           fscanf(a_fp,"%[^\n]",text);
  283.         }
  284.           if (!strcmp(type,"Subj:"))
  285.         {
  286.           fscanf(a_fp,"%[^\n]",text);
  287.           strcpy(a_temp->subject,text);
  288.         }
  289.         }
  290.       a_temp->art_num=loop;
  291.     }
  292.       else
  293.     {
  294.       sprintf(a_temp->date,"");
  295.       sprintf(a_temp->sender,"  --Article Missing--");
  296.       sprintf(a_temp->subject,"");
  297.       a_temp->art_num=loop;
  298.     } /* else */
  299.       art_arr[loop-(g_choice->first)]=a_temp;
  300.       if (a_fp != NULL) { fclose(a_fp); } 
  301.     }
  302.  
  303.   read_newsrc(art_arr,g_choice);
  304.   
  305.   menu_lines=(LINES-6);
  306.   menu_lines=(int)((menu_lines-1)/2);
  307.   menu_lines*=2;
  308.   menu_lines+=1;
  309.   menu_center=(int)((menu_lines+1)/2);
  310.   cur_point=first_unread(art_arr,g_choice);
  311.   cur_pos=cur_point-(g_choice->first-1);
  312.   while (cur_pos>menu_lines)
  313.     cur_pos-=(menu_center);
  314.     
  315.   
  316.   show_art_menu(art_arr,menu_lines,cur_point,cur_pos,g_choice->first,
  317.         g_choice->last);
  318.   art_menu_bottom(menu_lines);
  319.   mvaddstr(cur_pos,1,"===>");
  320.   refresh();
  321.   done=0;
  322.   while (!done)
  323.     {
  324.       switch(c=getch()) {
  325.       case 'k':
  326.       case '8':
  327.     if (cur_point > g_choice->first)
  328.       {
  329.         mvaddstr(cur_pos,1,"    ");
  330.         cur_point--;
  331.         if (cur_pos==1)
  332.           {
  333.         cur_pos=menu_center;
  334.         clear();
  335.         show_art_menu(art_arr,menu_lines,cur_point,cur_pos,
  336.                   g_choice->first,g_choice->last);
  337.         art_menu_bottom(menu_lines);
  338.           }
  339.         else
  340.           cur_pos--;
  341.         mvaddstr(cur_pos,1,"===>");
  342.         refresh();
  343.       } /* if cur_point > ... */
  344.     break; 
  345.       case 'K':
  346.       case '*':
  347.     if (cur_point > g_choice->first)
  348.       {
  349.         mvaddstr(cur_pos,1,"    ");
  350.         if (cur_pos > menu_center)
  351.           {
  352.         cur_point-=(cur_pos-menu_center);
  353.         cur_pos=menu_center;
  354.           }
  355.         else
  356.           {
  357.         cur_point-=cur_pos;
  358.         if (cur_point<g_choice->first)
  359.           {
  360.             cur_pos=1;
  361.             cur_point=g_choice->first;
  362.           }
  363.         else
  364.           {
  365.             cur_pos=menu_center;
  366.             clear();
  367.             show_art_menu(art_arr,menu_lines,cur_point,cur_pos,
  368.                   g_choice->first, g_choice->last);
  369.             art_menu_bottom(menu_lines);
  370.           } /* else */
  371.           } /* else */
  372.         mvaddstr(cur_pos,1,"===>");
  373.         refresh();
  374.       } /* if cur_point ... */
  375.     break;
  376.       case 'j':
  377.       case '2':
  378.       if (cur_point < g_choice->last)
  379.     {
  380.       mvaddstr(cur_pos,1,"    ");
  381.       cur_point++;
  382.       if (cur_pos==menu_lines)
  383.         {
  384.           cur_pos=menu_center;
  385.           clear();
  386.           show_art_menu(art_arr,menu_lines,cur_point,cur_pos,
  387.                 g_choice->first, g_choice->last);
  388.           art_menu_bottom(menu_lines);
  389.         }
  390.       else
  391.         cur_pos++;
  392.       mvaddstr(cur_pos,1,"===>");
  393.       refresh();
  394.     } /*  if cur_point... */
  395.       break;
  396.       case 'J':
  397.       case '@':
  398.     if (cur_point < g_choice->last)
  399.       {
  400.         mvaddstr(cur_pos,1,"    ");
  401.         if (cur_pos<menu_center)
  402.           {
  403.         cur_point+=(menu_center-cur_pos);
  404.         cur_pos=menu_center;
  405.           }
  406.         else
  407.           {
  408.         cur_point+=((menu_lines-cur_pos)+1);
  409.         if(cur_point>g_choice->last)
  410.           {
  411.             cur_point=g_choice->last;
  412.             cur_pos=cur_point-(g_choice->first-1);
  413.             while(cur_pos>menu_lines)
  414.               cur_pos-=menu_center;
  415.           }
  416.         else
  417.           {
  418.             cur_pos=menu_center;
  419.             clear();
  420.             show_art_menu(art_arr,menu_lines,cur_point,cur_pos,
  421.                   g_choice->first, g_choice->last);
  422.             art_menu_bottom(menu_lines);
  423.           } /* else*/
  424.           } /* else */
  425.         mvaddstr(cur_pos,1,"===>");
  426.         refresh();
  427.       } /* if cur_point... */
  428.     break;
  429.       case 'r':
  430.     if (art_arr!=NULL)
  431.       {
  432.         art_arr[cur_point-g_choice->first]->read=1;
  433.         mvaddstr(cur_pos,5,"*");
  434.         mvaddstr(cur_pos,5,"");
  435.       }
  436.     break;
  437.       case 'u':
  438.     if (art_arr!=NULL)
  439.       {
  440.         art_arr[cur_point-g_choice->first]->read=0;
  441.         mvaddstr(cur_pos,5," ");
  442.         mvaddstr(cur_pos,5,"");
  443.       }
  444.           break;
  445.       case '\n':
  446.       case '\r':
  447.       case ' ':
  448.     show_next = 0;
  449.     start_help_win();
  450.     do {
  451.         /* show the article with more */
  452. /*      sprintf(cmd,"more %s/%d",g_dir,cur_point);
  453.       sprintf(cmd,"%s/%d",g_dir,cur_point);
  454. */
  455.       sprintf(a_fn, "%s/%d", g_dir, cur_point);
  456. /*      cleanup(); */
  457. /*      system(cmd); */
  458. /*      show_file(a_fn); */
  459. /*      init_screen(); */
  460. /*      printf("\nPress RETURN to continue or [n] for the next article\n");
  461.       fflush(stdout);
  462. */
  463.         /* run the pager on the file.  pager() returns 'n'
  464.            if the user types n at the end of an article
  465.          */
  466.       if ((c = pager(a_fn)) != 'n'){ /* run the pager on this file */
  467.         statline("RETURN or [q] for article menu; [n] for next article"
  468.              , "");
  469.         c = getch();
  470.       }
  471.  
  472.       if (art_arr!=NULL)
  473.         art_arr[cur_point-g_choice->first]->read=1;
  474.  
  475.       if (c == 'n') {
  476.         show_next = 1;
  477.       } else {
  478.         show_next = 0;
  479.       }
  480.       if(cur_point<g_choice->last) {
  481.         cur_point++;
  482.         cur_pos++;
  483.         if (cur_pos>=menu_lines)
  484.            cur_pos-=menu_center;
  485.       } /* if cur_point < */
  486.     } while (show_next);
  487.     end_help_win();
  488.     clear();
  489.     show_art_menu(art_arr,menu_lines,cur_point,cur_pos,
  490.               g_choice->first,g_choice->last);
  491.     art_menu_bottom(menu_lines);
  492.     mvaddstr(cur_pos,1,"===>");
  493.     refresh();
  494.     break;
  495.       case 'Q':
  496.       case 'q':
  497.     done=1;
  498.     break;
  499.       } /* switch */
  500.     }   /* while */
  501.   /* Write out "newsrc" data for this group */
  502.   write_newsrc(art_arr,g_choice);
  503.   /* Clean up memory */
  504.   for (loop=g_choice->first;loop<=g_choice->last;loop++)
  505.     free(art_arr[loop-(g_choice->first)]);
  506.   free(art_arr);
  507.  
  508.   clear();
  509. } /* news_arts_menu */
  510.  
  511.  
  512. s_group *news_groups_menu(human,reading)
  513.      int human;            /* a flag to say if a human is posting. */
  514.      int reading;               /* a flag to say if we're only reading. */
  515. {
  516.   int ret;
  517.   char news_dir[100],g_fn[100],a_fn[100];
  518.   FILE *g_fp,*a_fp;
  519.   char g_name_in[100],post_in;
  520.   int first_in,last_in,g_index,total_groups,cur_pos,done,loop;
  521.   char s_in[100],c;
  522.   s_group *g_first,*g_temp,*g_ret;
  523.  
  524.   g_first=NULL;
  525.   g_temp=NULL;
  526.   total_groups=0;
  527.  
  528.   sprintf(news_dir,"%s",NEWS_DIR);
  529.   sprintf(g_fn,"%s/%s",news_dir,NGDB_FILE);
  530.   g_fp=fopen(g_fn,"r");
  531.   if (g_fp!=NULL)
  532. /*    while ((fscanf(g_fp,"%[^:]: %d %d %c",g_name_in,&first_in,&last_in,
  533.            &post_in))>0) */
  534.     while ((fgets(s_in,100,g_fp))!=NULL)
  535.       {
  536.     s_in[strlen(s_in)-1] = '\0';
  537.     sscanf(s_in,"%s %d %d %c",g_name_in,&first_in,&last_in,&post_in);
  538.     g_temp=(s_group *)malloc(sizeof(s_group));
  539.     sprintf((g_temp)->name,"%s",g_name_in);
  540.     (g_temp)->first=first_in;
  541.     (g_temp)->last=last_in;
  542.     (g_temp)->postable=post_in;
  543.     (g_temp)->next=NULL;
  544.     if ((human==0)||(g_temp->postable=='1'))
  545.       if (!reading||((g_temp->first)<=(g_temp->last)))
  546.       {
  547.         group_insert(&g_first,g_temp);
  548.         total_groups++;
  549.       }
  550.     else
  551.       free(g_temp);
  552.       }
  553.   if (g_fp != NULL) { fclose(g_fp); } 
  554.   clear();
  555.   if (g_first==NULL)
  556.     {
  557.       fprintf(stderr,"Problem getting group database\n");
  558.       return(NULL);
  559.     }
  560.   statline("choose the group you want (RETURN to exit)","news_group_choices");
  561.   statline2("*'s indicate articles exist","");
  562.   g_index=0;
  563.   for ((g_temp)=(g_first);(g_temp)!=NULL;(g_temp)=(g_temp)->next)
  564.     {
  565.       if ((g_temp)->last >= (g_temp)->first)
  566.     mvaddstr((g_index)+2,6,"*");
  567.       mvaddstr((g_index++)+2,7,(g_temp)->name);
  568.     }
  569.   mvaddstr(LINES-4,5,"Position arrow with [j]/[2] (down) and [k]/[8] (up)");
  570.   mvaddstr(LINES-3,5,"RETURN to Read, Q to Quit");
  571.   cur_pos=1;
  572.   mvaddstr(cur_pos+1,1,"===>");
  573.   refresh();
  574.   done=0;
  575.   g_temp=NULL;
  576. /*  if (total_groups==1)
  577.     {
  578.       done=1;
  579.       g_temp=g_first;
  580.     } */
  581.   while (!done)
  582.     {
  583.       switch(c=getch()) {
  584.       case 'k':
  585.       case '8':
  586.     if (cur_pos>1)
  587.       {
  588.         mvaddstr(cur_pos+1,1,"    ");
  589.         cur_pos--;
  590.         mvaddstr(cur_pos+1,1,"===>");
  591.         refresh();
  592.       }
  593.     break;
  594.       case 'j':
  595.       case '2':
  596.     if (cur_pos<total_groups)
  597.       {
  598.         mvaddstr(cur_pos+1,1,"    ");
  599.         cur_pos++;
  600.         mvaddstr(cur_pos+1,1,"===>");
  601.         refresh();
  602.       }
  603.     break;
  604.       case '\n':
  605.       case '\r':
  606.       case ' ':
  607.     g_temp=g_first;
  608.     if (cur_pos>1)
  609.       for(loop=2;loop<=cur_pos;loop++)
  610.         g_temp=g_temp->next;
  611.     done=1;
  612.     break;
  613.       case 'q':
  614.       case 'Q':
  615.     done = 1;
  616.     break;
  617.       } /* switch */
  618.     } /* while */
  619.   
  620. /*  ret = wget_name(stdscr, g_name_in);
  621.   if (ret > 0)
  622.     {
  623.       g_temp=group_find(g_first,g_name_in);
  624.       if (g_temp==NULL)
  625.     {
  626.       statline("Bad Group Name - Space to Return","Bad Group Name");
  627.       get_space();
  628.     }
  629.     }
  630.   clear();*/
  631. /* Clean up allocated space */
  632.   g_ret=g_temp;
  633.   for(g_temp=g_first;g_temp!=NULL;g_temp=g_first)
  634.     {
  635.       if (g_temp!=g_ret)
  636.     {
  637.       g_first=g_temp->next;
  638.       free(g_temp);
  639.     }
  640.       else
  641.     {
  642.       g_first=g_temp->next;
  643.       g_ret->next=NULL;
  644.     }
  645.     }
  646.   return(g_ret);
  647. } /* news_groups_menu */
  648.  
  649. news()
  650. {
  651.   int not_done;
  652.   char tmp_fname[PATHLEN];
  653.   char date[80];
  654.   char from[80];
  655.   char subj[80],out[100];
  656.   FILE *tmp_fp;
  657.   int ret;
  658.   s_group *g_first,*g_temp;
  659.   char group[80];
  660.   statline("do you want to (r)ead news or (p)ost news","news");
  661.   switch (getch()) {
  662.   case 'r':
  663.     g_temp=news_groups_menu(0,1); /* 0 = not human(n/a), 1 = reading */
  664. /*    if (g_temp!=NULL)
  665.       news_arts_menu(g_temp,world.turn);*/
  666.     while(g_temp!=NULL)
  667.       {
  668.     news_arts_menu(g_temp,world.turn);
  669.     g_temp=news_groups_menu(0,1); /* 0 = not human(n/a), 1=reading */
  670.       }
  671.     clear(); refresh();
  672.     break;
  673.   case 'p':
  674.     sprintf(date,"Thon %d",world.turn);
  675.     sprintf(from,"%s of %s",user.np->leader,user.np->name);
  676.     clear();
  677.     g_temp=news_groups_menu(1,0); /* 1=human, 0=posting(!reading) */
  678.     clear();
  679.     if(g_temp!=NULL)
  680.       {
  681.     strcpy(tmp_fname, "/usr/tmp/domXXXXXX");
  682.     if (mktemp(tmp_fname) == NULL) {
  683.       fprintf(stderr,"Error getting temp file name\n");
  684.       fflush(stderr);
  685.       return;
  686.     }
  687.     statline("Enter Subject","Posting News");
  688.     mvaddstr(2,1,"Subject: ");
  689.     wget_name(stdscr, subj);
  690. /*    echo();
  691.     nocbreak();
  692.     refresh();
  693.     scanw("%[^\n]",subj);
  694.     noecho();
  695.     cbreak();
  696.     refresh();
  697. */
  698.     cleanup();
  699.     edit(tmp_fname);
  700.     {
  701.       init_screen();
  702. /*      initscr();
  703.       savetty();
  704.       nonl();
  705.       cbreak();
  706.       noecho();
  707.       clear();
  708. */
  709.     }
  710.     mvaddstr(2,0,"Choices: S)end news or A)bort posting ");
  711.     refresh();
  712.     not_done=1;
  713.     while(not_done)
  714.       {
  715.         switch(getch()) {
  716.         case 'S':
  717.         case 's':
  718.           mvaddstr(3,9,"Posting News...");
  719.           refresh();
  720.           post_news_file(tmp_fname, g_temp->name, subj, user.id);
  721.           mvaddstr(3,24,"done.");
  722.           refresh();
  723.           not_done=0;
  724.           unlink(tmp_fname);
  725.           break;
  726.         case 'A':
  727.           mvaddstr(3,23,"OK. Aborting...");
  728.           refresh();
  729.           unlink(tmp_fname);
  730.           not_done=0;
  731.           break;
  732.         } /* switch */
  733.       } /* while */
  734.     {
  735.       cleanup();
  736.       init_screen();
  737.     }
  738.       } /* if g_temp!=NULL */
  739.     break;
  740.   } /* switch */
  741.   user.just_moved = 1;
  742. } /* news */
  743.