IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 4704


Ignore:
Timestamp:
Aug 3, 2005, 5:49:36 PM (21 years ago)
Author:
eugene
Message:

moved/improved queues

Location:
trunk/Ohana/src/opihi
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/opihi/include/data.h

    r4697 r4704  
    4444void PushQueueUnique (Queue *queue, char *line, int Key);
    4545void PushQueueReplace (Queue *queue, char *line, int Key);
     46int InitQueue (Queue *queue);
     47int DeleteQueue (Queue *queue);
     48int PrintQueue (FILE *f, Queue *queue);
    4649
    4750/* in sort.c */
  • trunk/Ohana/src/opihi/include/shell.h

    r4689 r4704  
    114114
    115115char *memstr (char *m1, char *m2, int n);
     116int write_fmt (int fd, char *format, ...);
    116117
    117118# endif
  • trunk/Ohana/src/opihi/lib.data/queues.c

    r4697 r4704  
    11# include "data.h"
    22
    3 /* These functions are somewhat fragile: we cannot do multiple CreateQueue
    4    invalidates the pointer from FindQueue.  Do we need a 'delete queue'
    5    function?
    6 */
    7 
    8 Queue *queues;   /* queue to store the list of all queues */
    9 int   Nqueues;   /* number of currently available queues */
     3Queue **queues;   /* queue to store the list of all queues */
     4int    Nqueues;   /* number of currently defined queues */
     5int    NQUEUES;   /* number of currently allocated queues */
    106
    117void InitQueues () {
    128  Nqueues = 0;
    13   ALLOCATE (queues, Queue, 1);
     9  NQUEUES = 16;
     10  ALLOCATE (queues, Queue *, NQUEUES);
    1411}
    1512
     
    2017
    2118  for (i = 0; i < Nqueues; i++) {
    22     fprintf (stderr, "%-15s %3d\n", queues[i].name, queues[i].Nlines);
     19    fprintf (stderr, "%-15s %3d\n", queues[i][0].name, queues[i][0].Nlines);
    2320  }
    2421  return;
     
    3128
    3229  for (i = 0; i < Nqueues; i++) {
    33     if (!strcmp (queues[i].name, name)) {
    34       return (&queues[i]);
     30    if (!strcmp (queues[i][0].name, name)) {
     31      return (&queues[i][0]);
    3532    }
    3633  }
    3734  return (NULL);
     35}
     36
     37/* make a new named queue */
     38int InitQueue (Queue *queue) {
     39
     40  int i;
     41
     42  for (i = 0; i < queue[0].Nlines; i++) {
     43    free (queue[0].lines[i]);
     44  }
     45  queue[0].Nlines = 0;
     46  queue[0].NLINES = 16;
     47  REALLOCATE (queue[0].lines, char *, queue[0].NLINES);
     48  return (TRUE);
    3849}
    3950
     
    4152Queue *CreateQueue (char *name) {
    4253
     54  int N;
    4355  Queue *queue;
    4456
     
    4658  if (queue != NULL) return (queue);
    4759
     60  N = Nqueues;
    4861  Nqueues ++;
    49   REALLOCATE (queues, Queue, Nqueues);
    50   queue = &queues[Nqueues - 1];
     62  CHECK_REALLOCATE (queues, Queue *, NQUEUES, Nqueues, 16);
     63  ALLOCATE (queue, Queue, 1);
    5164  queue[0].Nlines = 0;
    52   queue[0].NLINES = 10;
     65  queue[0].NLINES = 16;
    5366  queue[0].name = strcreate (name);
    5467  ALLOCATE (queue[0].lines, char *, queue[0].NLINES);
     68  queues[N] = queue;
    5569  return (queue);
     70}
     71
     72/* delete a queue */
     73int DeleteQueue (Queue *queue) {
     74
     75  int i, N, NQUEUES_2;
     76
     77  /* find queue in queue list */
     78  N = -1;
     79  for (i = 0; i < Nqueues; i++) {
     80    if (queues[i] == queue) {
     81      N = i;
     82      break;
     83    }
     84  }
     85  if (N == -1) return (FALSE);
     86
     87  for (i = N; i < Nqueues - 1; i++) {
     88    queues[i] = queues[i + 1];
     89  }
     90  Nqueues --;
     91  NQUEUES_2 = MAX (16, NQUEUES / 2);
     92  if (Nqueues < NQUEUES_2) {
     93    NQUEUES = NQUEUES_2;
     94    REALLOCATE (queues, Queue *, NQUEUES);
     95  }
     96
     97  free (queue[0].name);
     98  for (i = 0; i < queue[0].Nlines; i++) {
     99    free (queue[0].lines[i]);
     100  }
     101  free (queue[0].lines);
     102  free (queue);
     103  return (TRUE);
    56104}
    57105
     
    222270char *PopQueue (Queue *queue) {
    223271
    224   int i;
     272  int i, NLINES_2;
    225273  char *line;
    226274
     
    228276  line = queue[0].lines[0];
    229277
    230   for (i = 1; i < queue[0].Nlines; i++) {
    231     queue[0].lines[i-1] = queue[0].lines[i];
     278  for (i = 0; i < queue[0].Nlines - 1; i++) {
     279    queue[0].lines[i] = queue[0].lines[i+1];
    232280  }
    233281  queue[0].Nlines --;
    234282
    235   if (queue[0].Nlines < queue[0].NLINES - 20) {
    236     queue[0].NLINES -= 20;
    237     queue[0].NLINES = MAX (queue[0].NLINES, 10);
     283  NLINES_2 = MAX (16, queue[0].NLINES / 2);
     284  if (queue[0].Nlines < NLINES_2) {
     285    queue[0].NLINES = NLINES_2;
    238286    REALLOCATE (queue[0].lines, char *, queue[0].NLINES);
    239287  }   
     
    241289}
    242290
     291int PrintQueue (FILE *f, Queue *queue) {
     292
     293  int i;
     294
     295  if (queue[0].Nlines == 0) return (TRUE);
     296
     297  for (i = 0; i < queue[0].Nlines; i++) {
     298    fprintf (f, "%s\n", queue[0].lines[i]);
     299  }
     300  return (TRUE);
     301}
     302
Note: See TracChangeset for help on using the changeset viewer.