home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / progm / cbase.zip / CBASE10B.ZIP / ROLODECK.ZIP / FML.C < prev    next >
Text File  |  1989-10-31  |  5KB  |  186 lines

  1. /*    Copyright (c) 1989 Citadel    */
  2. /*       All Rights Reserved        */
  3.  
  4. /* #ident    "fml.c    1.2 - 89/10/31" */
  5.  
  6. #if __STDC__ == 1
  7. #include <errno.h>
  8. #include <stddef.h>
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #define CONST const
  13. #else
  14. #include <errno.h>
  15. void *calloc();        /* stdlib.h */
  16. void free();
  17. #include <stdio.h>
  18. #include <string.h>
  19. #include <sys/types.h>    /* size_t typedef */
  20. #define CONST
  21. #endif
  22.  
  23. #ifndef min
  24. #define min(a,b)    (((a) < (b)) ? (a) : (b))
  25. #endif
  26.  
  27. /*man---------------------------------------------------------------------------
  28. NAME
  29.      fmltolfm - convert name from fml to lfm format
  30.  
  31. SYNOPSIS
  32.      int fmltolfm(t, s, n)
  33.      char *t;
  34.      const char *s;
  35.      size_t n;
  36.  
  37. DESCRIPTION
  38.      The fmltolfm function converts a name from the format "first
  39.      middle last" to "last first middle".  s points to the source
  40.      string in fml format.  t points to the target string to receive
  41.      the converted name.  t and s may point to the same string.  There
  42.      may be more than one middle name, or the middle name may be
  43.      absent.  All leading and trailing spaces must be removed from the
  44.      source string before calling fmltolfm.
  45.  
  46.      fmltolfm will fail if one or more of the following is true:
  47.  
  48.      [EINVAL]       t or s is the NULL pointer.
  49.      [ENOMEM]       Not enough memory is available for
  50.                     allocation by the calling process.
  51.  
  52. SEE ALSO
  53.      lfmtofml.
  54.  
  55. DIAGNOSTICS
  56.      Upon successful completion, a value of 0 is returned.  Otherwise,
  57.      a value of -1 is returned, and errno set to indicate the error.
  58.  
  59. ------------------------------------------------------------------------------*/
  60. int fmltolfm(t, s, n)
  61. char *t;
  62. CONST char *s;
  63. size_t n;
  64. {
  65.     char *p = NULL;
  66.     char *ts = NULL;    /* temporary string */
  67.  
  68.     /* validate arguments */
  69.     if ((t == NULL) || (s == NULL) || (n < 2)) {
  70.         errno = EINVAL;
  71.         return -1;
  72.     }
  73.  
  74.     /* find beginning of last name */
  75.     p = strrchr(s, ' ');
  76.     if (p == NULL) {
  77.         strncpy(t, s, n);
  78.         t[n - 1] = '\0';
  79.         errno = 0;
  80.         return 0;
  81.     }
  82.  
  83.     /* create temporary string */
  84.     ts = (char *)calloc((size_t)n, (size_t)1);
  85.     if (ts == NULL) {
  86.         errno = ENOMEM;
  87.         return -1;
  88.     }
  89.  
  90.     /* perform conversion */
  91.     strncpy(ts, p + 1, n);            /* copy last name */
  92.     ts[n - 1] = '\0';
  93.     strncat(ts, " ", n - strlen(ts));    /* add space after last name */
  94.     ts[n - 1] = '\0';
  95.     strncat(ts, s, n - strlen(ts));        /* copy beginning of name */
  96.     ts[min(n - 1, strlen(s))] = '\0';
  97.     strncpy(t, ts, n);            /* copy converted string to t */
  98.     t[n - 1] = '\0';
  99.  
  100.     /* free temporary string */
  101.     free(ts);
  102.  
  103.     errno = 0;
  104.     return 0;
  105. }
  106.  
  107. /*man---------------------------------------------------------------------------
  108. NAME
  109.      lfmtofml - convert name from lfm to fml format
  110.  
  111. SYNOPSIS
  112.      int lfmtofml(t, s, n)
  113.      char *t;
  114.      const char *s;
  115.      size_t n;
  116.  
  117. DESCRIPTION
  118.      The lfmtofml function converts a name from the format "last
  119.      first middle" to "first middle last".  s points to the source
  120.      string in lfm format.  t points to the target string to receive
  121.      the converted name.  t and s may point to the same string.  There
  122.      may be more than one middle name, or the middle name may be
  123.      absent.  All leading and trailing spaces must be removed from the
  124.      source string before calling lfmtofml.
  125.  
  126.      lfmtofml will fail if one or more of the following is true:
  127.  
  128.      [EINVAL]       t or s is the NULL pointer.
  129.      [ENOMEM]       Enough memory is not available for
  130.                     allocation by the calling process.
  131.  
  132. SEE ALSO
  133.      fmltolfm.
  134.  
  135. DIAGNOSTICS
  136.      Upon successful completion, a value of 0 is returned.  Otherwise,
  137.      a value of -1 is returned, and errno set to indicate the error.
  138.  
  139. ------------------------------------------------------------------------------*/
  140. int lfmtofml(t, s, n)
  141. char *t;
  142. CONST char *s;
  143. size_t n;
  144. {
  145.     char *p = NULL;
  146.     char *ts = NULL;    /* temporary string */
  147.  
  148.     /* validate arguments */
  149.     if ((t == NULL) || (s == NULL) || (n < 2)) {
  150.         errno = EINVAL;
  151.         return -1;
  152.     }
  153.  
  154.     /* find end of last name */
  155.     p = strchr(s, ' ');
  156.     if (p == NULL) {
  157.         strncpy(t, s, n);
  158.         t[n - 1] = '\0';
  159.         errno = 0;
  160.         return 0;
  161.     }
  162.  
  163.     /* create temporary string */
  164.     ts = (char *)calloc((size_t)n, (size_t)1);
  165.     if (ts == NULL) {
  166.         errno = ENOMEM;
  167.         return -1;
  168.     }
  169.  
  170.     /* perform conversion */
  171.     strncpy(ts, p + 1, n);            /* copy beginning of name */
  172.     ts[n - 1] = '\0';
  173.     strncat(ts, " ", n - strlen(ts));    /* add space before last name */
  174.     ts[n - 1] = '\0';
  175.     strncat(ts, s, n - strlen(ts));        /* copy last name */
  176.     ts[min(n - 1, strlen(s))] = '\0';
  177.     strncpy(t, ts, n);            /* copy converted string to t */
  178.     t[n - 1] = '\0';
  179.  
  180.     /* free temporary string */
  181.     free(ts);
  182.  
  183.     errno = 0;
  184.     return 0;
  185. }
  186.