[comp.sources.d] Unoffical patch for nn on '286

wietse@wzv.win.tue.nl (Wietse Z. Venema) (07/05/89)

Considering the interest for nn on '286 machines I am posting a series
of prelimirary patches to get nn running under 16-bit UNIX (Microport
System-V/AT v2.3).  This is the result of two evenings with jove+lint.
Having no more time to work on nn, I hope it will serve as a starting
point for others.  The more people work on this, the sooner we will
have an official release that fully supports brain-damaged hardware.

Of course, this article was posted from within nn.

In the patches I use a macro INT(x) in order to validate some long ->
int conversions (these being the most common source of problems).  You
may want to define it (e.g. in config.h) as:

	#define	INT(x)	(int)(x)

Make sure you keep an unaltered version of the nn source so that future
official patches from the original author can still be applied.

*** ./articles.c-	Thu Jun 29 20:55:46 1989
--- ./articles.c	Tue Jul  4 19:49:56 1989
***************
*** 99,105 ****
  	if (current_str_t->next_thunk == NULL)
  	    new_thunk(current_str_t, 
  		      malloc(STR_THUNK_SIZE),
! 		      STR_THUNK_SIZE,
  		      "string bytes");
  
  	current_str_t = current_str_t->next_thunk;
--- 99,105 ----
  	if (current_str_t->next_thunk == NULL)
  	    new_thunk(current_str_t, 
  		      malloc(STR_THUNK_SIZE),
! 		      (long) STR_THUNK_SIZE,
  		      "string bytes");
  
  	current_str_t = current_str_t->next_thunk;
***************
*** 322,328 ****
      
      if (n_articles <= 1) return;
  
!     qsort(articles, n_articles, sizeof(article_header *), article_comp);
  	
      for (n = n_articles - 1, app = articles + 1; --n >= 0; app++)
  	if (article_equal(app, app - 1)) (**app).flag |= A_SAME;
--- 322,328 ----
      
      if (n_articles <= 1) return;
  
!     qsort(articles, INT(n_articles), sizeof(article_header *), article_comp);
  	
      for (n = n_articles - 1, app = articles + 1; --n >= 0; app++)
  	if (article_equal(app, app - 1)) (**app).flag |= A_SAME;
***************
*** 357,363 ****
  	articles[i]->flag &= ~A_SAME;
      
      if (n_articles <= 1) return;
!     qsort(articles, n_articles, sizeof(article_header *), 
  	  arrival ? offset_cmp : age_cmp);
  }
  
--- 357,363 ----
  	articles[i]->flag &= ~A_SAME;
      
      if (n_articles <= 1) return;
!     qsort(articles, INT(n_articles), sizeof(article_header *), 
  	  arrival ? offset_cmp : age_cmp);
  }
  
*** ./data.h-	Mon Jul  3 20:52:28 1989
--- ./data.h	Tue Jul  4 20:20:06 1989
***************
*** 36,43 ****
  
      int32		group_flag;
  
! #	define MF(n)	(1<<(n-1))
! #	define CF(n)	(1<<(n+15))
  
  #	define G_MASTER_FLAGS	(MF(17)-1) /* flags that are saved on file */
  
--- 36,43 ----
  
      int32		group_flag;
  
! #	define MF(n)	(((int32)1)<<(n-1))
! #	define CF(n)	(((int32)1)<<(n+15))
  
  #	define G_MASTER_FLAGS	(MF(17)-1) /* flags that are saved on file */
  
***************
*** 122,128 ****
      
      int32	flag;		/* flags: 			*/
  
! #	define AF(n) (1<<(n-1))
  
  #	define A_SELECT   	AF(1)	/* article has been selected	*/
  #	define A_SAME	    	AF(2)	/* same subject as prev. article */
--- 122,128 ----
      
      int32	flag;		/* flags: 			*/
  
! #	define AF(n) (((int32) 1)<<(n-1))
  
  #	define A_SELECT   	AF(1)	/* article has been selected	*/
  #	define A_SAME	    	AF(2)	/* same subject as prev. article */
*** ./answer.c-	Mon Jul  3 20:52:25 1989
--- ./answer.c	Tue Jul  4 19:49:49 1989
***************
*** 26,31 ****
--- 26,34 ----
      char *pgm, *first_action, *record_file;
      int edit_message;
      char *str;
+ #if defined(iAPX286) && defined(lint)
+  static
+ #endif
      news_header_buffer nhbuf, dhbuf;
      
      first_action = "edit";
*** ./collect.c-	Mon Jul  3 20:52:26 1989
--- ./collect.c	Tue Jul  4 19:49:51 1989
***************
*** 90,95 ****
--- 90,98 ----
  article_number art_num;
  {
      FILE *art_file;
+ #if defined(iAPX286) && defined(lint)
+  static
+ #endif
      news_header_buffer nhbuf, dgbuf;
      article_header art_hdr;
      int mode, count;
*** ./db.c-	Thu Jun 29 20:55:48 1989
--- ./db.c	Tue Jul  4 19:49:59 1989
***************
*** 177,183 ****
  update_group(gh)
  group_header *gh;
  {
!     int flag;
  
      flag = gh->group_flag & ~G_MASTER_FLAGS;
  
--- 177,183 ----
  update_group(gh)
  group_header *gh;
  {
!     int32 flag;
  
      flag = gh->group_flag & ~G_MASTER_FLAGS;
  
*** ./group.c-	Mon Jul  3 20:52:31 1989
--- ./group.c	Tue Jul  4 19:50:05 1989
***************
*** 456,462 ****
  
      if (menu_cmd == ME_READ || menu_cmd == ME_NO_ARTICLES) {
  	if (did_selection) {
! 	    int was_read = gh->group_flag & G_READ;
  
  	    prev_last = gh->last_l_article;
  	    gh->last_l_article = last_article;
--- 456,462 ----
  
      if (menu_cmd == ME_READ || menu_cmd == ME_NO_ARTICLES) {
  	if (did_selection) {
! 	    int32 was_read = gh->group_flag & G_READ;
  
  	    prev_last = gh->last_l_article;
  	    gh->last_l_article = last_article;
***************
*** 855,861 ****
  	
  	printf("\r%s", cur->group_name); clrline();
  	
! 	access_group(cur, -1, cur->last_l_article, access_mode, submask, do_kill);
      }
      merge_memory();
      if (n_articles == 0) return;
--- 855,861 ----
  	
  	printf("\r%s", cur->group_name); clrline();
  	
! 	access_group(cur, (article_number) -1, cur->last_l_article, access_mode, submask, do_kill);
      }
      merge_memory();
      if (n_articles == 0) return;
*** ./kill.c-	Mon Jul  3 20:52:37 1989
--- ./kill.c	Tue Jul  4 19:50:07 1989
***************
*** 385,396 ****
      if (fread(&header, sizeof(header), 1, killf) != 1) goto err;
      if (header.ckh_magic != COMP_KILL_MAGIC) goto err;
  
!     patterns = malloc(header.ckh_pattern_size);
!     mem_check(patterns, header.ckh_pattern_size, "kill bytes");
      
      kill_tab = (kill_list_entry *)
! 	calloc(header.ckh_entries, sizeof(kill_list_entry));
!     mem_check(kill_tab, header.ckh_entries, "kill entries");
      
      for (n = header.ckh_entries, kl = kill_tab; --n >= 0; kl++) {
  	if (fread(&entry, sizeof(entry), 1, killf) != 1) goto err;
--- 385,396 ----
      if (fread(&header, sizeof(header), 1, killf) != 1) goto err;
      if (header.ckh_magic != COMP_KILL_MAGIC) goto err;
  
!     patterns = malloc(INT(header.ckh_pattern_size));
!     mem_check(patterns, INT(header.ckh_pattern_size), "kill bytes");
      
      kill_tab = (kill_list_entry *)
! 	calloc(INT(header.ckh_entries), sizeof(kill_list_entry));
!     mem_check(kill_tab, INT(header.ckh_entries), "kill entries");
      
      for (n = header.ckh_entries, kl = kill_tab; --n >= 0; kl++) {
  	if (fread(&entry, sizeof(entry), 1, killf) != 1) goto err;
***************
*** 412,419 ****
  	}
      }
  	      
!     if (fread(patterns, sizeof(char), header.ckh_pattern_size, killf)
! 	!=  header.ckh_pattern_size) goto err;
  
      fclose(killf);
      
--- 412,419 ----
  	}
      }
  	      
!     if (fread(patterns, sizeof(char), INT(header.ckh_pattern_size), killf)
! 	!=  INT(header.ckh_pattern_size)) goto err;
  
      fclose(killf);
      
*** ./master.c-	Mon Jul  3 20:52:41 1989
--- ./master.c	Tue Jul  4 21:47:52 1989
***************
*** 412,418 ****
  save_group(gh)
  group_header *gh;
  {
!     int flag;
      
      flag = gh->group_flag;
      gh->group_flag &= G_MASTER_FLAGS;
--- 412,418 ----
  save_group(gh)
  group_header *gh;
  {
!     int32 flag;
      
      flag = gh->group_flag;
      gh->group_flag &= G_MASTER_FLAGS;
***************
*** 534,540 ****
      
      open_master(OPEN_CREATE);
  
!     fseek(master_file, sizeof(master), 0);
      
      master.number_of_groups = 0;
      
--- 534,540 ----
      
      open_master(OPEN_CREATE);
  
!     fseek(master_file, (long) sizeof(master), 0);
      
      master.number_of_groups = 0;
      
*** ./regexp.c-	Thu Jun 29 20:56:33 1989
--- ./regexp.c	Tue Jul  4 19:50:12 1989
***************
*** 248,254 ****
  	FAIL("regexp too big");
  
      /* Allocate space. */
!     r = (regexp *) malloc(sizeof(regexp) + (unsigned) regsize);
      if (r == NULL)
  	FAIL("out of space");
  
--- 248,254 ----
  	FAIL("regexp too big");
  
      /* Allocate space. */
!     r = (regexp *) malloc(sizeof(regexp) + (unsigned int) regsize);
      if (r == NULL)
  	FAIL("out of space");
  
*** ./term.c-	Mon Jul  3 20:53:22 1989
--- ./term.c	Tue Jul  4 23:01:01 1989
***************
*** 36,41 ****
--- 36,42 ----
  
  #define HAS_CAP(str) (str && *str)
  
+ char *tgoto();
  #else
  
  #define USE_TERMCAP
***************
*** 233,239 ****
  #endif
      
  #ifdef USE_TERMINFO
!     setupterm(0,1,0);
      Columns = columns;
      Lines = lines;
      cookie_size = magic_cookie_glitch;
--- 234,240 ----
  #endif
      
  #ifdef USE_TERMINFO
!     setupterm((char *) 0,1,(int *) 0);
      Columns = columns;
      Lines = lines;
      cookie_size = magic_cookie_glitch;
*** ./unshar.c-	Thu Jun 29 20:56:39 1989
--- ./unshar.c	Tue Jul  4 19:49:52 1989
***************
*** 32,37 ****
--- 32,40 ----
      long pos, ftell ();
      
      /* Results from star matcher */
+ #if defined(iAPX286) && defined(lint)
+  static
+ #endif
      char res1[BUFSIZ], res2[BUFSIZ], res3[BUFSIZ], res4[BUFSIZ];
      char *result[4];
      
*** ./nn.c-	Thu Jun 29 20:56:23 1989
--- ./nn.c	Tue Jul  4 19:50:09 1989
***************
*** 352,358 ****
  		cur->last_l_article = 0;
  	    }
  	} else
! 	    menu_cmd = group_menu(cur, -1, 
  				  match_subject, do_kill_handling, menu);
  
  	if (menu_cmd != ME_NO_ARTICLES)
--- 352,358 ----
  		cur->last_l_article = 0;
  	    }
  	} else
! 	    menu_cmd = group_menu(cur, (article_number) -1, 
  				  match_subject, do_kill_handling, menu);
  
  	if (menu_cmd != ME_NO_ARTICLES)
*** ./admin.c-	Thu Jun 29 20:55:45 1989
--- ./admin.c	Tue Jul  4 20:24:59 1989
***************
*** 49,55 ****
  long min_val, max_val;
  {
      char buf[100];
!     int val;
      
   loop:
      
--- 49,55 ----
  long min_val, max_val;
  {
      char buf[100];
!     long val;
      
   loop:
      
***************
*** 219,225 ****
  	 case 'O':
  	    c = get_cmd("r)epeat_delay  e)xpire_level", "OPTION");
  	    if (c != 'r' && c != 'e') break;
! 	    value = get_entry("Option value", 1, 10000);
  	    if (value < 0) break;
  	    send_master(c, (long)value, 0L);
  	    break;
--- 219,225 ----
  	 case 'O':
  	    c = get_cmd("r)epeat_delay  e)xpire_level", "OPTION");
  	    if (c != 'r' && c != 'e') break;
! 	    value = get_entry("Option value", (long) 1, (long) 10000);
  	    if (value < 0) break;
  	    send_master(c, (long)value, 0L);
  	    break;
*** ./rc.c-	Mon Jul  3 20:51:23 1989
--- ./rc.c	Tue Jul  4 20:53:17 1989
***************
*** 423,429 ****
      int was_unread;
      
      art = gh->last_l_article - gh->last_article;
!     was_unread = (gh->group_flag & G_UNREAD_COUNT);
      
      if (mode > 0) {
  	if (was_unread) return 0;
--- 423,429 ----
      int was_unread;
      
      art = gh->last_l_article - gh->last_article;
!     was_unread = ((gh->group_flag & G_UNREAD_COUNT) != 0);
      
      if (mode > 0) {
  	if (was_unread) return 0;
*** ./sequence.c-	Mon Jul  3 20:51:42 1989
--- ./sequence.c	Tue Jul  4 21:08:16 1989
***************
*** 359,365 ****
  
  static faked_entry(name, flag)
  char *name;
! int flag;
  {
      group_header *gh;
      
--- 359,365 ----
  
  static faked_entry(name, flag)
  char *name;
! int32 flag;
  {
      group_header *gh;