STRLST.C
上传用户:sunrenlu
上传日期:2022-06-13
资源大小:1419k
文件大小:4k
源码类别:

操作系统开发

开发平台:

DOS

  1. /*
  2.  * String List Library
  3.  * Copyright (c) 1990, 1999 Erick Engelke
  4.  */
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <rtos.h>
  8. #include <strlst.h>
  9. stringlist *strlst_new( void )
  10. {
  11.     stringlist *sl;
  12.     if ( (sl = kcalloc( sizeof( stringlist ), 1 )) != NULL )
  13.         sl->sl_sig = _STRLST_SL_SIG;
  14.     return( sl );
  15. }
  16. /*
  17.  * returns the 1 based index of the new string, or 0 on failure
  18.  */
  19. int strlst_adddata( stringlist *sl, char *s, void *d )
  20. {
  21.     int i;
  22.     stringentry *se, *stemp;
  23.     if ( sl == NULL ) return( 0 );
  24.     if ( sl->sl_sig != _STRLST_SL_SIG ) return( 0 );
  25.     se = kcalloc( sizeof( stringentry ) , 1 );
  26.     if ( se == NULL ) goto fail;
  27.     se->se_sig = _STRLST_SE_SIG;
  28.     /* allocate space, even if orig string is zero length */
  29.     if ( (se->se_string = kstrdup( s )) == NULL ) goto fail;
  30.     se->se_data = d;
  31.     if ( sl->sl_list == NULL ) {
  32.         sl->sl_list = se;
  33.         return( 1 );
  34.     }
  35.     stemp = sl->sl_list;
  36.     i = 1;
  37.     while ( stemp->se_next ) {
  38.         stemp = stemp->se_next;
  39.         i++;
  40.     }
  41.     stemp->se_next = se;
  42.     return( i );
  43. fail:
  44.     if ( se != NULL ) {
  45.         if ( se->se_string != NULL ) kfree ( se->se_string);
  46.         kfree( se );
  47.     }
  48.     return( 0 );
  49. }
  50. int strlst_add( stringlist *sl, char *s )
  51. {
  52.     return( strlst_adddata( sl, s, NULL ));
  53. }
  54. static void free_entry( stringentry *se )
  55. {
  56.     if ( se != NULL ) {
  57.         if ( se->se_sig== _STRLST_SE_SIG ) {
  58.             if ( se->se_string != NULL ) kfree( se->se_string );
  59.             kfree( se );
  60.         }
  61.     }
  62. }
  63. void strlst_del( stringlist *sl, int index )
  64. {
  65.     stringentry *se, *sf;
  66.     int i;
  67.     if ( sl == NULL ) return;
  68.     if ( sl->sl_sig != _STRLST_SL_SIG ) return;
  69.     se = sl->sl_list;
  70.     if ( se == NULL ) return;
  71.     if ( se->se_sig != _STRLST_SE_SIG ) return;
  72.     i = 1;
  73.     if ( index == 1 ) {
  74.         sl->sl_list = se->se_next;
  75.         free_entry( se );
  76.         return;
  77.     }
  78.     while ( se != NULL ) {
  79.         sf = se->se_next;
  80.         if ( i == index - 1 ) {
  81.             if ( sf != NULL ) {
  82.                 se->se_next = sf->se_next;
  83.                 free_entry( sf );
  84.             } else
  85.                 se->se_next = NULL;
  86.             return;
  87.         }
  88.         i++;
  89.         se = sf;
  90.     }
  91.     return;
  92. }
  93. void strlst_freeall( stringlist *sl )
  94. {
  95.     stringentry *se, *sf;
  96.     if ( sl == NULL ) return;
  97.     if ( sl->sl_sig != _STRLST_SL_SIG ) return;
  98.     for ( se = sl->sl_list ; se != NULL ; se = sf ) {
  99.         sf = se->se_next;
  100.         if ( se->se_sig == _STRLST_SE_SIG )
  101.             free_entry( se );
  102.     }
  103.     kfree( sl );
  104. }
  105. char *strlst_getfirst( stringlist *sl, void **dummy, BYTE **data )
  106. {
  107.     stringentry *se;
  108.     if ( sl == NULL ) return( NULL );
  109.     se = sl->sl_list;
  110.     if ( se == NULL ) return( NULL );
  111.     if ( dummy ) *dummy = se->se_next;
  112.     if (data) *data = se->se_data;
  113.     return( se->se_string );
  114. }
  115. char *strlst_getnext( stringlist *sl, void **dummy, BYTE **data )
  116. {
  117.     stringentry *se;
  118.     se = *dummy;
  119.     if (se == NULL ) return( NULL );
  120.     *dummy = se->se_next;
  121.     if (data) *data = se->se_data;
  122.     return( se->se_string );
  123. }
  124. char *strlst_findfirst( stringlist *sl, char *text, void **dummy, BYTE **data )
  125. {
  126.     stringentry *se;
  127.     if ( sl == NULL ) return( NULL );
  128.     se = sl->sl_list;
  129.     while ( se != NULL ) {
  130.         if ( !strcmp( se->se_string, text )) {
  131.             if ( dummy ) *dummy = se->se_next;
  132.             if (data) *data = se->se_data;
  133.             return( se->se_string );
  134.         }
  135.         se = se->se_next;
  136.     }
  137.     return( NULL );
  138. }