home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk1.iso / altsrc / articles / 10884 < prev    next >
Text File  |  1994-07-16  |  33KB  |  1,087 lines

  1. Path: wupost!psuvax1!news.pop.psu.edu!news.cac.psu.edu!newsserver.jvnc.net!howland.reston.ans.net!EU.net!sunic!news.funet.fi!hydra.Helsinki.FI!usenet
  2. From: lars.wirzenius@helsinki.fi (Lars Wirzenius)
  3. Newsgroups: alt.sources
  4. Subject: Publib liw-modules (part 06/07)
  5. Followup-To: alt.sources.d
  6. Date: 16 Jul 1994 20:28:48 GMT
  7. Organization: University of Helsinki, Department of Computer Science
  8. Lines: 1073
  9. Message-ID: <309fu0$gum@hydra.Helsinki.FI>
  10. References: <309fre$gu4@hydra.Helsinki.FI>
  11. NNTP-Posting-Host: hydra.helsinki.fi
  12. Keywords: Publib, library, ANSI C
  13.  
  14. Archive-name: liw-modules/part06
  15. Submitted-by: lars.wirzenius@helsinki.fi
  16.  
  17. Publib is a library of reusable C functions, and a mechanism for building
  18. the library.
  19.  
  20. ---- Cut Here and unpack ----
  21. #!/bin/sh
  22. # this is part 6 of a multipart archive
  23. # do not concatenate these parts, unpack them in order with /bin/sh
  24. # file ./strutil/strins.c continued
  25. #
  26. CurArch=6
  27. if test ! -r s2_seq_.tmp
  28. then echo "Please unpack part 1 first!"
  29.      exit 1; fi
  30. ( read Scheck
  31.   if test "$Scheck" != $CurArch
  32.   then echo "Please unpack part $Scheck next!"
  33.        exit 1;
  34.   else exit 0; fi
  35. ) < s2_seq_.tmp || exit 1
  36. echo "x - Continuing file ./strutil/strins.c"
  37. sed 's/^X//' << 'SHAR_EOF' >> ./strutil/strins.c
  38. X * strins.c -- insert a string at the beginning of another string
  39. X *
  40. X * Part of publib.  See man page for more information
  41. X * "@(#)publib-strutil:strins.c,v 1.2 1994/02/05 17:08:44 liw Exp"
  42. X */
  43. X
  44. X#include <assert.h>
  45. X#include <string.h>
  46. X#include "publib/strutil.h"
  47. X
  48. Xchar *strins(char *tgt, const char *src) {
  49. X    size_t srclen;
  50. X
  51. X    assert(tgt != NULL);
  52. X    assert(src != NULL);
  53. X    assert(!memoverlap(tgt, strlen(tgt)+strlen(src)+1, src, strlen(src)+1));
  54. X
  55. X    srclen = strlen(src);
  56. X    memmove(tgt + srclen, tgt, strlen(tgt) + 1);    /* +1 for '\0' */
  57. X    memcpy(tgt, src, srclen);
  58. X
  59. X    return tgt;
  60. X}
  61. SHAR_EOF
  62. echo "File ./strutil/strins.c is complete"
  63. chmod 0644 ./strutil/strins.c || echo "restore of ./strutil/strins.c fails"
  64. echo "x - extracting ./strutil/strltrim.3 (Text)"
  65. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strltrim.3 &&
  66. X.\" part of publib
  67. X.\" "@(#)publib-strutil:strltrim.3,v 1.1.1.1 1994/02/03 17:25:29 liw Exp"
  68. X.\"
  69. X.TH STRLTRIM 3 "C Programmer's Manual" Publib "C Programmer's Manual"
  70. X.SH NAME
  71. Xstrltrim \- remove leading whitespace from string
  72. X.SH SYNOPSIS
  73. X.nf
  74. X#include <publib.h>
  75. Xchar *\fBstrltrim\fR(char *\fIs\fR);
  76. X.SH DESCRIPTION
  77. X\fIstrltrim\fR removes all leading whitespace characters from the
  78. Xbeginning of a string, by moving everything starting from the first
  79. Xnon-whitespace character to the beginning of the string.  As whitespace
  80. Xis counted everything for which \fIisspace\fR(3) returns true.
  81. X.SH "RETURN VALUE"
  82. X\fIstrltrim\fR returns its argument.
  83. X.SH EXAMPLE
  84. XTo remove all indentation from all lines in a program, you might do
  85. Xthe following:
  86. X.sp 1
  87. X.nf
  88. X.in +5
  89. X#include <publib.h>
  90. X
  91. Xint main(void) {
  92. X    char line[512];
  93. X
  94. X    while (fgets(line, sizeof(line), stdio) != NULL) {
  95. X        strltrim(line);
  96. X        printf("%s", line);
  97. X    }
  98. X    return 0;
  99. X}
  100. X.in -5
  101. X.SH "SEE ALSO"
  102. Xpublib(3), strrtrim(3), strtrim(3), isspace(3)
  103. X.SH AUTHOR
  104. XLars Wirzenius (lars.wirzenius@helsinki.fi)
  105. SHAR_EOF
  106. chmod 0644 ./strutil/strltrim.3 || echo "restore of ./strutil/strltrim.3 fails"
  107. echo "x - extracting ./strutil/strltrim.c (Text)"
  108. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strltrim.c &&
  109. X/*
  110. X * strltrim.c -- remove leading whitespace from string
  111. X *
  112. X * Part of publib.  See man page for more information
  113. X * "@(#)publib-strutil:strltrim.c,v 1.1.1.1 1994/02/03 17:25:29 liw Exp"
  114. X */
  115. X
  116. X#include <assert.h>
  117. X#include <ctype.h>
  118. X#include <string.h>
  119. X
  120. X#include "publib/strutil.h"
  121. X
  122. Xchar *strltrim(char *s) {
  123. X    char *t;
  124. X
  125. X    assert(s != NULL);
  126. X    for (t = s; isspace(*t); ++t)
  127. X        continue;
  128. X    memmove(s, t, strlen(t)+1);    /* +1 so that '\0' is moved too */
  129. X    return s;
  130. X}
  131. SHAR_EOF
  132. chmod 0644 ./strutil/strltrim.c || echo "restore of ./strutil/strltrim.c fails"
  133. echo "x - extracting ./strutil/strmaxcpy.3 (Text)"
  134. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strmaxcpy.3 &&
  135. X.\" part of publib
  136. X.\" "@(#)publib-strutil:strmaxcpy.3,v 1.1.1.1 1994/02/03 17:25:29 liw Exp"
  137. X.\"
  138. X.TH STRMAXCPY 3 "C Programmer's Manual" Publib "C Programmer's Manual"
  139. X.SH NAME
  140. Xstrmaxcpy \- copy at most a given number of characters of string
  141. X.SH SYNOPSIS
  142. X.nf
  143. X#include <publib.h>
  144. Xchar *\fBstrmaxcpy\fR(char *\fItgt\fR, const char *\fIsrc\fR, size_t \fIn\fR);
  145. X.SH DESCRIPTION
  146. X\fIstrmaxcpy\fR copies up to \fIn-1\fR characters from the beginning of
  147. X\fIsrc\fR to \fItgt\fR, then adds a '\\0'.  \fIn\fR must be at least 1.
  148. XThe target string must be large enough to hold the result.
  149. X.PP
  150. XNote that unlike \fIstrncpy\fR(3), this function always terminates the
  151. Xresult with '\\0'.  It also doesn't fill the result with extra '\\0'
  152. Xcharacters.
  153. X.SH "RETURN VALUE"
  154. X\fIstrmaxcpy\fR returns its first argument.
  155. X.SH EXAMPLE
  156. XTo print out the first 69 characters of a string, you might do the
  157. Xfollowing (although familiarity with printf's format string might
  158. Xbe more useful in this case).
  159. X.sp 1
  160. X.nf
  161. X.in +5
  162. X#include <stdio.h>
  163. X#include <publib.h>
  164. X
  165. Xvoid print42(const char *string) {
  166. X    char copy[43];    /* 42 + '\\0' */
  167. X
  168. X    puts(strmaxcpy(copy, string, sizeof(copy)));
  169. X}
  170. X.in -5
  171. X.SH "SEE ALSO"
  172. Xpublib(3), strncpy(3)
  173. X.SH AUTHOR
  174. XLars Wirzenius (lars.wirzenius@helsinki.fi)
  175. SHAR_EOF
  176. chmod 0644 ./strutil/strmaxcpy.3 || echo "restore of ./strutil/strmaxcpy.3 fails"
  177. echo "x - extracting ./strutil/strmaxcpy.c (Text)"
  178. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strmaxcpy.c &&
  179. X/*
  180. X * strmaxcpy.c -- copy at most a given number of characters of string
  181. X *
  182. X * Part of publib.  See man page for more information
  183. X * "@(#)publib-strutil:strmaxcpy.c,v 1.2 1994/02/05 17:08:44 liw Exp"
  184. X */
  185. X
  186. X#include <assert.h>
  187. X#include <string.h>
  188. X#include "publib/strutil.h"
  189. X
  190. Xchar *strmaxcpy(char *tgt, const char *src, size_t n) {
  191. X    assert(tgt != NULL);
  192. X    assert(src != NULL);
  193. X    assert(n > 0);
  194. X    assert(!memoverlap(tgt, n+1, src, strlen(src)+1));
  195. X
  196. X    *tgt = '\0';
  197. X    strncat(tgt, src, n);
  198. X
  199. X    return tgt;
  200. X}
  201. SHAR_EOF
  202. chmod 0644 ./strutil/strmaxcpy.c || echo "restore of ./strutil/strmaxcpy.c fails"
  203. echo "x - extracting ./strutil/strmove.3 (Text)"
  204. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strmove.3 &&
  205. X.\" part of publib
  206. X.\" "@(#)publib-strutil:strmove.3,v 1.1 1994/06/20 20:30:18 liw Exp"
  207. X.\"
  208. X.TH STRMOVE 3 "C Programmer's Manual" Publib "C Programmer's Manual"
  209. X.SH NAME
  210. Xstrmove \- make a copy of a string, handling overlapping strings
  211. X.SH SYNOPSIS
  212. X.nf
  213. X#include <publib.h>
  214. Xchar *\fBstrmove\fR(char *\fItgt\fR, const char *\fIsrc\fR);
  215. X.SH DESCRIPTION
  216. X\fIstrmove\fR copies the string \fIsrc\fR to \fItgt\fR, just like
  217. X\fIstrcpy\fR(3), but handles overlapping moves correctly (cf. \fImemcpy\fR(3)
  218. Xvs. \fImemmove\fR(3)).
  219. X.SH "RETURN VALUE"
  220. X\fIstrmove\fR returns \fItgt\fR.
  221. X.SH "SEE ALSO"
  222. Xpublib(3), strcpy(3), memcpy(3), memmove(3)
  223. X.SH AUTHOR
  224. XLars Wirzenius (lars.wirzenius@helsinki.fi)
  225. SHAR_EOF
  226. chmod 0644 ./strutil/strmove.3 || echo "restore of ./strutil/strmove.3 fails"
  227. echo "x - extracting ./strutil/strrev.3 (Text)"
  228. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strrev.3 &&
  229. X.\" part of publib
  230. X.\" "@(#)publib-strutil:strrev.3,v 1.3 1994/06/20 20:30:30 liw Exp"
  231. X.\"
  232. X.TH STRREV 3 "C Programmer's Manual" Publib "C Programmer's Manual"
  233. X.SH NAME
  234. Xstrrev \- reverse a string in place
  235. X.SH SYNOPSIS
  236. X.nf
  237. X#include <publib.h>
  238. Xchar *\fBstrrev\fR(char *\fIstr\fR);
  239. X.SH DESCRIPTION
  240. X\fIstrrev\fR reverses the argument string in place, i.e., it swaps
  241. Xthe \fIi\fRth character from the beginning with the \fIi\fRth
  242. Xcharacter from the end.
  243. X.SH "RETURN VALUE"
  244. X\fIstrrev\fR returns its argument.
  245. X.SH EXAMPLE
  246. XReversing "dlrow, elloh" would be done like the following.
  247. X.sp 1
  248. X.nf
  249. X.in +5
  250. Xchar str[] = "dlrow, elloh";
  251. X
  252. Xputs(strrev(str));
  253. X.in -5
  254. X.sp 1
  255. X.fi
  256. XThis would output "hello, world".
  257. XNote that using the string literal as the argument would be an error,
  258. Xsince it is not allowable to modify string literals.
  259. X.SH BUGS
  260. XDoes not automatically detect palindromes, nor automatically return
  261. Xwithout doing anything.
  262. X.SH "SEE ALSO"
  263. Xpublib(3), memrev(3)
  264. X.SH AUTHOR
  265. XLars Wirzenius (lars.wirzenius@helsinki.fi)
  266. SHAR_EOF
  267. chmod 0644 ./strutil/strrev.3 || echo "restore of ./strutil/strrev.3 fails"
  268. echo "x - extracting ./strutil/strmove.c (Text)"
  269. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strmove.c &&
  270. X/*
  271. X * strmove.c -- copy a string to another, possibly overlapping place
  272. X *
  273. X * Part of publib.  See man page for more information
  274. X * "@(#)publib-strutil:strmove.c,v 1.1 1994/06/20 20:30:20 liw Exp"
  275. X */
  276. X
  277. X#include <assert.h>
  278. X#include <string.h>
  279. X#include "publib/strutil.h"
  280. X
  281. Xchar *strmove(char *tgt, const char *src) {
  282. X    assert(tgt != NULL);
  283. X    assert(src != NULL);
  284. X
  285. X    return memmove(tgt, src, strlen(src) + 1);
  286. X}
  287. SHAR_EOF
  288. chmod 0644 ./strutil/strmove.c || echo "restore of ./strutil/strmove.c fails"
  289. echo "x - extracting ./strutil/strmtrim.3 (Text)"
  290. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strmtrim.3 &&
  291. X.\" part of publib
  292. X.\" "@(#)publib-strutil:strmtrim.3,v 1.1 1994/06/20 20:30:21 liw Exp"
  293. X.\"
  294. X.TH STRMTRIM 3 "C Programmer's Manual" Publib "C Programmer's Manual"
  295. X.SH NAME
  296. Xstrmtrim \- replace multiple white spaces with single blanks within string
  297. X.SH SYNOPSIS
  298. X.nf
  299. X#include <publib.h>
  300. Xchar *\fBstrmtrim\fR(char *\fIstr\fR);
  301. X.SH DESCRIPTION
  302. X\fIstrmtrim\fR will replace every run of whitespace characters
  303. X(as defined by \fIisspace\fR(3)) with a single blank.  It will not
  304. Xtouch leading and trailing whitespace (use \fIstrltrim\fR(3) and
  305. X\fIstrrtrim\fR(3) for those).
  306. X.SH "RETURN VALUE"
  307. X\fIstrmtrim\fR will return the value of its argument.
  308. X.SH "SEE ALSO"
  309. Xpublib(3), strtrim(3), strltrim(3), strrtrim(3)
  310. X.SH AUTHOR
  311. XLars Wirzenius (lars.wirzenius@helsinki.fi)
  312. SHAR_EOF
  313. chmod 0644 ./strutil/strmtrim.3 || echo "restore of ./strutil/strmtrim.3 fails"
  314. echo "x - extracting ./strutil/strmtrim.c (Text)"
  315. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strmtrim.c &&
  316. X/*
  317. X * strmtrim.c -- replace multiple white spaces with single blanks within string
  318. X *
  319. X * Part of publib.  See man page for more information.
  320. X * "@(#)publib-strutil:strmtrim.c,v 1.1 1994/06/20 20:30:22 liw Exp"
  321. X */
  322. X
  323. X#include <assert.h>
  324. X#include <ctype.h>
  325. X#include "publib/strutil.h"
  326. X
  327. Xchar *strmtrim(char *str) {
  328. X    char *s, *t, *u;
  329. X
  330. X    assert(str != NULL);
  331. X
  332. X    for (s = str; isspace(*s); ++s)
  333. X        continue;
  334. X
  335. X    t = s;
  336. X    for (;;) {
  337. X        if (!isspace(*t)) {
  338. X            *s = *t;
  339. X            if (*t == '\0')
  340. X                break;
  341. X            ++s;
  342. X            ++t;
  343. X        } else {
  344. X            u = t;
  345. X            while (isspace(*++t))
  346. X                continue;
  347. X            if (*t == '\0') {
  348. X                while ((*s++ = *u++) != '\0')
  349. X                    continue;
  350. X                break;
  351. X            }
  352. X            *s++ = ' ';
  353. X        }
  354. X    }
  355. X
  356. X    return str;
  357. X}
  358. SHAR_EOF
  359. chmod 0644 ./strutil/strmtrim.c || echo "restore of ./strutil/strmtrim.c fails"
  360. echo "x - extracting ./strutil/strndup.3 (Text)"
  361. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strndup.3 &&
  362. X.\" part of publib
  363. X.\" "@(#)publib-strutil:strndup.3,v 1.1 1994/06/20 20:30:23 liw Exp"
  364. X.\"
  365. X.TH STRNDUP 3 "C Programmer's Manual" Publib "C Programmer's Manual"
  366. X.SH NAME
  367. Xstrndup \- duplicate part of a string
  368. X.SH SYNOPSIS
  369. X.nf
  370. X#include <publib.h>
  371. Xchar *\fBstrndup\fR(const char *\fIstr\fR, size_t \fIn\fR);
  372. X.SH DESCRIPTION
  373. X\fIstrndup\fR will make a duplicate of the \fIn\fR first characters
  374. Xof \fIstr\fR, using \fImalloc\fR(3) to allocate memory for the
  375. Xduplicate.  The caller is supposed to free the duplicate's memory
  376. Xwhen no longer needed.
  377. X.SH "RETURN VALUE"
  378. X\fIstrndup\fR will return a pointer to the duplicate, or NULL if no
  379. Xmemory could be allocated.
  380. X.SH "SEE ALSO"
  381. Xpublib(3), strdup(3)
  382. X.SH AUTHOR
  383. XLars Wirzenius (lars.wirzenius@helsinki.fi)
  384. SHAR_EOF
  385. chmod 0644 ./strutil/strndup.3 || echo "restore of ./strutil/strndup.3 fails"
  386. echo "x - extracting ./strutil/strndup.c (Text)"
  387. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strndup.c &&
  388. X/*
  389. X * strndup.c -- duplicate at most a given beginning of a string
  390. X *
  391. X * Part of publib.  See man page for more information.
  392. X * "@(#)publib-strutil:strndup.c,v 1.1 1994/06/20 20:30:24 liw Exp"
  393. X */
  394. X
  395. X#include <assert.h>
  396. X#include <string.h>
  397. X#include <stdlib.h>
  398. X#include <stdarg.h>
  399. X#include "publib/strutil.h"
  400. X#include "publib/errormsg.h"
  401. X
  402. Xchar *strndup(const char *str, size_t n) {
  403. X    char *dup;
  404. X    size_t len;
  405. X
  406. X    len = strlen(str);
  407. X    if (n > len)
  408. X        n = len;
  409. X
  410. X    dup = malloc(n+1);
  411. X    if (dup == NULL) {
  412. X        __publib_error("malloc failed");
  413. X        return NULL;
  414. X    }
  415. X
  416. X    memcpy(dup, str, n);
  417. X    dup[n] = '\0';
  418. X    return dup;
  419. X}
  420. SHAR_EOF
  421. chmod 0644 ./strutil/strndup.c || echo "restore of ./strutil/strndup.c fails"
  422. echo "x - extracting ./strutil/stroverlap.3 (Text)"
  423. sed 's/^X//' << 'SHAR_EOF' > ./strutil/stroverlap.3 &&
  424. X.\" part of publib
  425. X.\" "@(#)publib-strutil:stroverlap.3,v 1.1 1994/06/20 20:30:25 liw Exp"
  426. X.\"
  427. X.TH STROVERLAP 3 "C Programmer's Manual" Publib "C Programmer's Manual"
  428. X.SH NAME
  429. Xstroverlap \- check whether two strings overlap
  430. X.SH SYNOPSIS
  431. X.nf
  432. X#include <publib.h>
  433. Xint \fBstroverlap\fR(const char *\fIs\fR, const char *\fIt\fR);
  434. X.SH DESCRIPTION
  435. X\fIstroverlap\fR checks whether the storage used by two strings
  436. Xoverlap (i.e., if they even partially stored in the same place
  437. Xin memory).
  438. X.SH "RETURN VALUE"
  439. X\fIstroverlap\fR returns 0 for no overlap, nonzero for any overlap
  440. Xat all.
  441. X.SH "SEE ALSO"
  442. Xpublib(3), memoverlap(3)
  443. X.SH AUTHOR
  444. XLars Wirzenius (lars.wirzenius@helsinki.fi)
  445. SHAR_EOF
  446. chmod 0644 ./strutil/stroverlap.3 || echo "restore of ./strutil/stroverlap.3 fails"
  447. echo "x - extracting ./strutil/stroverlap.c (Text)"
  448. sed 's/^X//' << 'SHAR_EOF' > ./strutil/stroverlap.c &&
  449. X/*
  450. X * stroverlap.c -- check whether two strings overlap
  451. X *
  452. X * Part of publib.  See man page for more information
  453. X * "@(#)publib-strutil:stroverlap.c,v 1.1 1994/06/20 20:30:28 liw Exp"
  454. X */
  455. X
  456. X#include <assert.h>
  457. X#include <string.h>
  458. X#include "publib/strutil.h"
  459. X
  460. Xint stroverlap(const char *s, const char *t) {
  461. X    assert(s != NULL);
  462. X    assert(t != NULL);
  463. X    return memoverlap(s, strlen(s)+1, t, strlen(t)+1);
  464. X}
  465. SHAR_EOF
  466. chmod 0644 ./strutil/stroverlap.c || echo "restore of ./strutil/stroverlap.c fails"
  467. echo "x - extracting ./strutil/strrev.c (Text)"
  468. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strrev.c &&
  469. X/*
  470. X * strrev.c -- reverse a string in place
  471. X *
  472. X * Part of publib.  See man page for more information
  473. X * "@(#)publib-strutil:strrev.c,v 1.1.1.1 1994/02/03 17:25:30 liw Exp"
  474. X */
  475. X
  476. X#include <assert.h>
  477. X#include "publib/strutil.h"
  478. X
  479. Xchar *strrev(char *s) {
  480. X    char c, *t, *origs = s;
  481. X
  482. X    assert(s != NULL);
  483. X
  484. X    for (t = s+strlen(s); s < t; ++s, --t) {
  485. X        c = *s;
  486. X        *s = *t;
  487. X        *t = c;
  488. X    }
  489. X    return origs;
  490. X}
  491. SHAR_EOF
  492. chmod 0644 ./strutil/strrev.c || echo "restore of ./strutil/strrev.c fails"
  493. echo "x - extracting ./strutil/strright.3 (Text)"
  494. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strright.3 &&
  495. X.\" part of publib
  496. X.\" "@(#)publib-strutil:strright.3,v 1.1 1994/06/20 20:30:31 liw Exp"
  497. X.\"
  498. X.TH STRRIGHT 3 "C Programmer's Manual" Publib "C Programmer's Manual"
  499. X.SH NAME
  500. Xstrright \- return a pointer to the beginning of the rightmost n chars in a string
  501. X.SH SYNOPSIS
  502. X.nf
  503. X#include <publib.h>
  504. Xchar *\fBstrright\fR(const char *\fIs\fR, size_t \fIn\fR);
  505. X.SH DESCRIPTION
  506. X\fIstrright\fR will return a pointer to the first of the \fIn\fR rightmost
  507. Xcharacters (not counting the '\\0') in the string \fIs\fR.  It does \fInot\fR
  508. Xmake a copy of the string, but will return a pointer into the argument
  509. Xstring.
  510. X.SH "SEE ALSO"
  511. Xpublib(3)
  512. X.SH AUTHOR
  513. XLars Wirzenius (lars.wirzenius@helsinki.fi)
  514. SHAR_EOF
  515. chmod 0644 ./strutil/strright.3 || echo "restore of ./strutil/strright.3 fails"
  516. echo "x - extracting ./strutil/strright.c (Text)"
  517. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strright.c &&
  518. X/*
  519. X * strright.c -- return a pointer to the beginning of the rightmost n chars
  520. X *
  521. X * Part of publib.  See man page for more information
  522. X * "@(#)publib-strutil:strright.c,v 1.1 1994/06/20 20:30:32 liw Exp"
  523. X */
  524. X
  525. X#include <assert.h>
  526. X#include <string.h>
  527. X#include "publib/strutil.h"
  528. X
  529. Xchar *strright(const char *s, size_t n) {
  530. X    size_t len;
  531. X
  532. X    assert(s != NULL);
  533. X    len = strlen(s);
  534. X    if (n > len)
  535. X        n = 0;
  536. X    return (char *)s + (len - n);
  537. X}
  538. SHAR_EOF
  539. chmod 0644 ./strutil/strright.c || echo "restore of ./strutil/strright.c fails"
  540. echo "x - extracting ./strutil/strrot13.3 (Text)"
  541. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strrot13.3 &&
  542. X.\" part of publib
  543. X.\" "@(#)publib-strutil:strrot13.3,v 1.1 1994/02/05 17:09:25 liw Exp"
  544. X.\"
  545. X.TH STRROT13 3 "C Programmer's Manual" Publib "C Programmer's Manual"
  546. X.SH NAME
  547. Xstrrot13 \- encrypt or decrypt string using rot13
  548. X.SH SYNOPSIS
  549. X.nf
  550. X#include <publib.h>
  551. Xchar *\fBstrrot13\fR(char *\fIstr\fR);
  552. X.SH DESCRIPTION
  553. X\fIstrrot13\fR converts the argument string using rot13, i.e., it
  554. Xreplaces each letter a with n, n with a, b with o, o with b, and
  555. Xso on.  Converting twice results in the original string.  Non-letter
  556. Xcharacters are not converted.
  557. X.PP
  558. XThe rot13 encryption method is used commonly on USENET to hide
  559. Xoffensive text, or spoilers in discussions about movies or books,
  560. Xor in other similar occasions.
  561. X.SH "RETURN VALUE"
  562. X\fIstrrot13\fR returns its argument.
  563. X.SH "SEE ALSO"
  564. Xpublib(3), crypt(3)
  565. X.SH AUTHOR
  566. XLars Wirzenius (lars.wirzenius@helsinki.fi)
  567. SHAR_EOF
  568. chmod 0644 ./strutil/strrot13.3 || echo "restore of ./strutil/strrot13.3 fails"
  569. echo "x - extracting ./strutil/strrot13.c (Text)"
  570. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strrot13.c &&
  571. X/*
  572. X * strrot13.c -- encrypt string with rot13
  573. X *
  574. X * Part of publib.  See man page for more information
  575. X * "@(#)publib-strutil:strrot13.c,v 1.1.1.1 1994/02/03 17:25:31 liw Exp"
  576. X */
  577. X
  578. X#include <assert.h>
  579. X#include "publib/strutil.h"
  580. X
  581. X#define N    26
  582. X
  583. X
  584. X/* Warning: this code assumes ASCII */
  585. Xchar *strrot13(char *str) {
  586. X    char *s = str;
  587. X
  588. X    while (*s != '\0') {
  589. X        if ((*s >= 'a' && *s <= 'm') || (*s >= 'A' && *s <= 'M'))
  590. X            *s += 13;
  591. X        else if ((*s >= 'n' && *s <= 'z') || (*s >= 'N' && *s <= 'Z'))
  592. X            *s -= 13;
  593. X        ++s;
  594. X    }
  595. X    return str;
  596. X}
  597. SHAR_EOF
  598. chmod 0644 ./strutil/strrot13.c || echo "restore of ./strutil/strrot13.c fails"
  599. echo "x - extracting ./strutil/strrstr.3 (Text)"
  600. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strrstr.3 &&
  601. X.\" part of publib
  602. X.\" "@(#)publib-strutil:strrstr.3,v 1.1.1.1 1994/02/03 17:25:29 liw Exp"
  603. X.\"
  604. X.TH STRRSTR 3 "C Programmer's Manual" Publib "C Programmer's Manual"
  605. X.SH NAME
  606. Xstrrstr \- locate last occurence of substring
  607. X.SH SYNOPSIS
  608. X.nf
  609. X#include <publib.h>
  610. Xchar *\fBstrrstr\fR(const char *\fIstr\fR, const char *\fIpat\fR);
  611. X.SH DESCRIPTION
  612. X\fIstrrstr\fR finds the last occurence of the string \fIpat\fR in
  613. Xthe string \fIstr\fR.  The terminating '\\0' characters are not
  614. Xcompared.
  615. X.SH "RETURN VALUE"
  616. X\fIstrrstr\fR returns a pointer to the first character of the substring,
  617. Xor \fBNULL\fR if the substring is not found.
  618. X.SH EXAMPLE
  619. XTo print out everything on each line starting with the last occurence
  620. Xof "/* " on each line, you might use the following code:
  621. X.sp 1
  622. X.nf
  623. X.in +5
  624. X#include <stdio.h>
  625. X#include <publib.h>
  626. X
  627. Xint main(void) {
  628. X    char *p, line[512];
  629. X
  630. X    while (fgets(line, sizeof(line), stdin) != NULL) {
  631. X        p = strrstr(line, "/* ");
  632. X        if (p != NULL)
  633. X            printf("%s", p);
  634. X    }
  635. X    return 0;
  636. X}
  637. X.in -5
  638. X.SH "SEE ALSO"
  639. Xpublib(3), string(3), strstr(3)
  640. X.SH AUTHOR
  641. XLars Wirzenius (lars.wirzenius@helsinki.fi)
  642. SHAR_EOF
  643. chmod 0644 ./strutil/strrstr.3 || echo "restore of ./strutil/strrstr.3 fails"
  644. echo "x - extracting ./strutil/strrstr.c (Text)"
  645. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strrstr.c &&
  646. X/*
  647. X * strrstr.c -- find last occurence of string in another string
  648. X *
  649. X * Part of publib.  See man page for more information.
  650. X * "@(#)publib-strutil:strrstr.c,v 1.1.1.1 1994/02/03 17:25:29 liw Exp"
  651. X */
  652. X
  653. X#include <assert.h>
  654. X#include <string.h>
  655. X#include "publib/strutil.h"
  656. X
  657. Xchar *strrstr(const char *str, const char *pat) {
  658. X    size_t len, patlen;
  659. X    const char *p;
  660. X
  661. X    assert(str != NULL);
  662. X    assert(pat != NULL);
  663. X
  664. X    len = strlen(str);
  665. X    patlen = strlen(pat);
  666. X
  667. X    if (patlen > len)
  668. X        return NULL;
  669. X    for (p = str + (len - patlen); p > str; --p)
  670. X        if (*p == *pat && strncmp(p, pat, patlen) == 0)
  671. X            return (char *) p;
  672. X    return NULL;
  673. X}
  674. SHAR_EOF
  675. chmod 0644 ./strutil/strrstr.c || echo "restore of ./strutil/strrstr.c fails"
  676. echo "x - extracting ./strutil/strrtrim.3 (Text)"
  677. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strrtrim.3 &&
  678. X.\" part of publib
  679. X.\" "@(#)publib-strutil:strrtrim.3,v 1.1.1.1 1994/02/03 17:25:30 liw Exp"
  680. X.\"
  681. X.TH STRRTRIM 3 "C Programmer's Manual" Publib "C Programmer's Manual"
  682. X.SH NAME
  683. Xstrrtrim \- remove trailing whitespace
  684. X.SH SYNOPSIS
  685. X.nf
  686. X#include <publib.h>
  687. Xchar *\fBstrrtrim\fR(char *\fIs\fR);
  688. X.SH DESCRIPTION
  689. X\fIstrrtrim\fR removes all trailing whitespace characters from the
  690. Xend of a string.  As whitespace is counted everything for which
  691. X\fIisspace\fR(3) returns true.
  692. X.SH "RETURN VALUE"
  693. X\fIstrltrim\fR returns its argument.
  694. X.SH EXAMPLE
  695. XTo remove whitespace from the end of all lines, you might do the
  696. Xfollowing:
  697. X.sp 1
  698. X.nf
  699. X.in +5
  700. X#include <publib.h>
  701. X
  702. Xint main(void) {
  703. X    char line[512];
  704. X
  705. X    while (fgets(line, sizeof(line), stdio) != NULL) {
  706. X        strrtrim(line);
  707. X        printf("%s", line);
  708. X    }
  709. X    return 0;
  710. X}
  711. X.in -5
  712. X.SH "SEE ALSO"
  713. Xpublib(3), strtrim(3), strltrim(3), isspace(3)
  714. X.SH AUTHOR
  715. XLars Wirzenius (lars.wirzenius@helsinki.fi)
  716. SHAR_EOF
  717. chmod 0644 ./strutil/strrtrim.3 || echo "restore of ./strutil/strrtrim.3 fails"
  718. echo "x - extracting ./strutil/strrtrim.c (Text)"
  719. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strrtrim.c &&
  720. X/*
  721. X * strrtrim.c -- remove trailing whitespace from a string
  722. X *
  723. X * Part of publib.  See man page for more information
  724. X * "@(#)publib-strutil:strrtrim.c,v 1.3 1994/07/16 12:11:02 liw Exp"
  725. X */
  726. X
  727. X#include <assert.h>
  728. X#include <ctype.h>
  729. X#include <string.h>
  730. X
  731. X#include "publib/strutil.h"
  732. X
  733. Xchar *strrtrim(char *s) {
  734. X    char *t, *tt;
  735. X
  736. X    assert(s != NULL);
  737. X
  738. X    for (tt = t = s; *t != '\0'; ++t)
  739. X        if (!isspace(*t))
  740. X            tt = t+1;
  741. X    *tt = '\0';
  742. X
  743. X    return s;
  744. X}
  745. SHAR_EOF
  746. chmod 0644 ./strutil/strrtrim.c || echo "restore of ./strutil/strrtrim.c fails"
  747. echo "x - extracting ./strutil/strset.3 (Text)"
  748. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strset.3 &&
  749. X.\" part of publib
  750. X.\" "@(#)publib-strutil:strset.3,v 1.1 1994/06/20 20:30:35 liw Exp"
  751. X.\"
  752. X.TH STRSET 3 "C Programmer's Manual" Publib "C Programmer's Manual"
  753. X.SH NAME
  754. Xstrset \- set all characters in a string to a given character
  755. X.SH SYNOPSIS
  756. X.nf
  757. X#include <publib.h>
  758. Xchar *\fBstrset\fR(char *\fIstr\fR, int \fIc\fR);
  759. X.SH DESCRIPTION
  760. X\fIstrset\fR will set all characters (before the terminating '\\0') in
  761. Xthe string \fIstr\fR to \fIc\fR.
  762. X.SH "RETURN VALUE"
  763. X\fIstrset\fR returns its first argument.
  764. X.SH "SEE ALSO"
  765. Xpublib(3), memset(3)
  766. X.SH AUTHOR
  767. XLars Wirzenius (lars.wirzenius@helsinki.fi)
  768. SHAR_EOF
  769. chmod 0644 ./strutil/strset.3 || echo "restore of ./strutil/strset.3 fails"
  770. echo "x - extracting ./strutil/strset.c (Text)"
  771. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strset.c &&
  772. X/*
  773. X * strset.c -- set all characters in a string to a given character
  774. X *
  775. X * Part of publib.  See man page for more information
  776. X * "@(#)publib-strutil:strset.c,v 1.1 1994/06/20 20:30:36 liw Exp"
  777. X */
  778. X
  779. X#include <assert.h>
  780. X#include <string.h>
  781. X#include "publib/strutil.h"
  782. X
  783. Xchar *strset(char *str, int c) {
  784. X    char *s;
  785. X    assert(str != NULL);
  786. X
  787. X    for (s = str; *s != '\0'; ++s)
  788. X        *s = c;
  789. X    return str;
  790. X}
  791. SHAR_EOF
  792. chmod 0644 ./strutil/strset.c || echo "restore of ./strutil/strset.c fails"
  793. echo "x - extracting ./strutil/strshuffle.3 (Text)"
  794. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strshuffle.3 &&
  795. X.\" part of publib
  796. X.\" "@(#)publib-strutil:strshuffle.3,v 1.1 1994/06/20 20:30:37 liw Exp"
  797. X.\"
  798. X.TH STRSHUFFLE 3 "C Programmer's Manual" Publib "C Programmer's Manual"
  799. X.SH NAME
  800. Xstrshuffle \- make the characters in a string be in random order
  801. X.SH SYNOPSIS
  802. X.nf
  803. X#include <publib.h>
  804. Xchar *\fBstrshuffle\fR(char *\fIstr\fR);
  805. X.SH DESCRIPTION
  806. X\fIstrshuffle\fR will make the characters in a string be in random
  807. Xorder.
  808. X.SH "RETURN VALUE"
  809. X\fIstrshuffle\fR will return its argument.
  810. X.SH "SEE ALSO"
  811. Xpublib(3), memshuffle(3)
  812. X.SH AUTHOR
  813. XLars Wirzenius (lars.wirzenius@helsinki.fi)
  814. SHAR_EOF
  815. chmod 0644 ./strutil/strshuffle.3 || echo "restore of ./strutil/strshuffle.3 fails"
  816. echo "x - extracting ./strutil/strshuffle.c (Text)"
  817. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strshuffle.c &&
  818. X/*
  819. X * strshuffle.c -- make the characters in a string be in random order
  820. X *
  821. X * Part of publib.  See man page for more information
  822. X * "@(#)publib-strutil:strshuffle.c,v 1.1 1994/06/20 20:30:38 liw Exp"
  823. X */
  824. X
  825. X#include <assert.h>
  826. X#include <string.h>
  827. X#include <stdlib.h>
  828. X#include "publib/strutil.h"
  829. X
  830. X
  831. Xchar *strshuffle(char *str) {
  832. X    assert(str != NULL);
  833. X    return memshuffle(str, 1, strlen(str));
  834. X}
  835. SHAR_EOF
  836. chmod 0644 ./strutil/strshuffle.c || echo "restore of ./strutil/strshuffle.c fails"
  837. echo "x - extracting ./strutil/strsplit.3 (Text)"
  838. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strsplit.3 &&
  839. X.\" part of publib
  840. X.\" "@(#)publib-strutil:strsplit.3,v 1.2 1994/02/19 20:58:36 liw Exp"
  841. X.\"
  842. X.TH STRSPLIT 3 "C Programmer's Manual" Publib "C Programmer's Manual"
  843. X.SH NAME
  844. Xstrsplit \- split string into words
  845. X.SH SYNOPSIS
  846. X.nf
  847. X#include <publib.h>
  848. Xint \fBstrsplit\fR(char *\fIsrc\fR, char **\fIwords\fR, int \fImaxw\fR, const char *\fIsep\fR);
  849. X.SH DESCRIPTION
  850. X\fIstrsplit\fR splits the \fIsrc\fR string into words separated by one
  851. Xor more of the characters in \fIsep\fR (or by whitespace characters, as
  852. Xspecified by \fIisspace\fR(3), if \fIsep\fR is the empty string).
  853. XPointers to the words are stored in successive elements in the array
  854. Xpointed to by \fIwords\fR.  No more than \fImaxw\fR pointers are stored.
  855. XThe input string is modifed by replacing the separator character
  856. Xfollowing a word with '\\0'.  However, if there are more than \fImaxw\fR
  857. Xwords, only \fImaxw\fR-1 words will be returned, and the \fImaxw\fRth 
  858. Xpointer in the array will point to the rest of the string.  If
  859. X\fImaxw\fR is 0, no modification is done.  This can be used for counting
  860. Xhow many words there are, e.g., so that space for the word pointer table
  861. Xcan be allocated dynamically.
  862. X.PP
  863. Xstrsplit splits the src string into words separated by one or more
  864. Xof the characters in sep (or by whitespace characters, as defined by
  865. Xisspace(3), if sep is the empty string).  The src string is modified
  866. Xby replacing the separator character after each word with '\\0'.  A
  867. Xpointer to each word is stored into successive elements of the
  868. Xarray words.  If there are more than maxw words, a '\\0' is stored
  869. Xafter the first maxw-1 words only, and the words[maxw-1] will contain
  870. Xa pointer to the rest of the string after the word in words[maxw-2].
  871. X
  872. X.SH "RETURN VALUE"
  873. X\fIstrsplit\fR returns the total number of words in the input string.
  874. X.SH EXAMPLE
  875. XAssuming that words are separated by white space, to count the number
  876. Xof words on a line, one might say the following.
  877. X.sp 1
  878. X.nf
  879. X.in +5
  880. Xn = strsplit(line, NULL, 0, "");
  881. X.in -5
  882. X.PP
  883. XTo print out the fields of a colon-separated list (such as PATH, or a
  884. Xline from /etc/passwd or /etc/group), one might do the following.
  885. X.sp 1
  886. X.nf
  887. X.in +5
  888. Xchar *fields[15];
  889. Xint i, n;
  890. X
  891. Xn = strsplit(list, fields, 15, ":");
  892. Xif (n > 15)
  893. X    n = 15;
  894. Xfor (i = 0; i < n; ++i)
  895. X    printf("field %d: %s\\n", i, fields[i]);
  896. X.in -5
  897. X.PP
  898. XIn real life, one would of course prefer to not restrict the number of
  899. Xfields, so one might either allocated the pointer table dynamically
  900. X(first counting the number of words using something like the first
  901. Xexample), or realize that since it is the original string that is
  902. Xbeing modified, one can do the following:
  903. X.sp 1
  904. X.nf
  905. X.in +5
  906. Xchar *fields[15];
  907. Xint i, n;
  908. X
  909. Xdo {
  910. X    n = strsplit(list, fields, 15, ":");
  911. X    if (n > 15)
  912. X        n = 15;
  913. X    for (i = 0; i < n; ++i)
  914. X        printf("field %d: %s\\n", i, fields[i]);
  915. X    list = field[n-1] + strlen(field[n-1]);
  916. X} while (n == 15);
  917. X.in -5
  918. X.SH "SEE ALSO"
  919. Xpublib(3), strtok(3)
  920. X.SH AUTHOR
  921. XThe idea for this function came from C-News source code by Henry Spencer
  922. Xand Geoff Collyer.  Their function is very similar, but this
  923. Ximplementation is by Lars Wirzenius (lars.wirzenius@helsinki.fi)
  924. SHAR_EOF
  925. chmod 0644 ./strutil/strsplit.3 || echo "restore of ./strutil/strsplit.3 fails"
  926. echo "x - extracting ./strutil/strsplit.c (Text)"
  927. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strsplit.c &&
  928. X/*
  929. X * strsplit.c -- split a string into "words"
  930. X *
  931. X * Part of publib.  See man page for more information
  932. X * "@(#)publib-strutil:strsplit.c,v 1.3 1994/02/19 20:58:38 liw Exp"
  933. X */
  934. X
  935. X#include <assert.h>
  936. X#include <ctype.h>
  937. X#include <string.h>
  938. X#include <stdlib.h>
  939. X
  940. X#include "publib/strutil.h"
  941. X
  942. Xstatic char *find_nonsep(const char *s, const char *sep);
  943. Xstatic char *find_sep(const char *s, const char *sep);
  944. X
  945. Xint strsplit(char *s, char **words, int maxw, const char *sep) {
  946. X    char *start, *end;
  947. X    int count;
  948. X
  949. X    assert(s != NULL);
  950. X    assert(words != NULL || maxw == 0);
  951. X    assert(sep != NULL);
  952. X    assert(!memoverlap(s, strlen(s)+1, sep, strlen(sep)+1));
  953. X
  954. X    count = 0;
  955. X    end = s;
  956. X    while ((start = find_nonsep(end, sep)) != NULL) {
  957. X        end = find_sep(start, sep);
  958. X        if (count == maxw-1 && find_nonsep(end, sep) != NULL) {
  959. X            words[count] = start;
  960. X            
  961. X        }
  962. X        if (count < maxw) {
  963. X            *end++ = '\0';
  964. X            words[count] = start;
  965. X        }
  966. X        ++count;
  967. X    }
  968. X
  969. X    return count;
  970. X}
  971. X
  972. X
  973. X/* Find first character that is not a separator, starting with the character
  974. X   at s.  Return NULL if not found.  */
  975. Xstatic char *find_nonsep(const char *s, const char *sep) {
  976. X    if (sep != NULL)
  977. X        s += strspn(s, sep);
  978. X    else
  979. X        while (isspace(*s))
  980. X            ++s;
  981. X    return *s == '\0' ? NULL : (char *) s;
  982. X}
  983. X
  984. X
  985. X/* Find first character that is a separator, starting with the character
  986. X   at s.  Treat '\0' as a separator, so that the call always succeeds.  */
  987. Xstatic char *find_sep(const char *s, const char *sep) {
  988. X    if (sep != NULL)
  989. X        s += strcspn(s, sep);
  990. X    else
  991. X        while (*s != '\0' && !isspace(*s))
  992. X            ++s;
  993. X    return (char *) s;
  994. X}
  995. SHAR_EOF
  996. chmod 0644 ./strutil/strsplit.c || echo "restore of ./strutil/strsplit.c fails"
  997. echo "x - extracting ./strutil/strsub.3 (Text)"
  998. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strsub.3 &&
  999. X.\" part of publib
  1000. X.\" "@(#)publib-strutil:strsub.3,v 1.1.1.1 1994/02/03 17:25:30 liw Exp"
  1001. X.\"
  1002. X.TH STRSUB 3 "C Programmer's Manual" Publib "C Programmer's Manual"
  1003. X.SH NAME
  1004. Xstrsub \- substitute first occurence of pattern with another string
  1005. X.SH SYNOPSIS
  1006. X.nf
  1007. X#include <publib.h>
  1008. Xchar *\fBstrsub\fR(char *\fIstr\fR, const char *\fIpat\fR, const char *\fIsub\fR);
  1009. X.SH DESCRIPTION
  1010. X\fIstrsub\fR finds the first occurence of the pattern \fIpat\fR in the
  1011. Xstring \fIstr\fR (using a method similar to \fIstrstr\fR(3), i.e., no
  1012. Xregular expressions), and replaces it with \fIsub\fR. 
  1013. XIf \fIpat\fR does not occur in \fIstr\fR, no substitution is made.
  1014. X.PP
  1015. XOf course, if \fIsub\fR is an empty string, the pattern is deleted from
  1016. Xthe string.
  1017. X.SH "RETURN VALUE"
  1018. X\fIstrsub\fR returns a pointer to the first character after the substitution,
  1019. Xor NULL if no substitution was made.
  1020. X.SH EXAMPLE
  1021. XTo substitute up to two occurences of "foo" with "bar" in a line,
  1022. Xone might do the following.
  1023. X.sp 1
  1024. X.nf
  1025. X.in +5
  1026. Xp = strsub(line, "foo", "bar");
  1027. Xif (p != NULL)
  1028. X    strsub(line, "foo", "bar");
  1029. X.in -5
  1030. X.SH "SEE ALSO"
  1031. Xpublib(3), strstr(3), strgsub(3)
  1032. X.SH AUTHOR
  1033. XLars Wirzenius (lars.wirzenius@helsinki.fi)
  1034. SHAR_EOF
  1035. chmod 0644 ./strutil/strsub.3 || echo "restore of ./strutil/strsub.3 fails"
  1036. echo "x - extracting ./strutil/strsub.c (Text)"
  1037. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strsub.c &&
  1038. X/*
  1039. X * strsub.c -- substitute first occurence of pattern with another string
  1040. X *
  1041. X * Part of publib.  See man page for more information
  1042. X * "@(#)publib-strutil:strsub.c,v 1.1.1.1 1994/02/03 17:25:30 liw Exp"
  1043. X */
  1044. X
  1045. X#include <assert.h>
  1046. X#include <string.h>
  1047. X#include "publib/strutil.h"
  1048. X
  1049. Xchar *strsub(char *str, const char *pat, const char *sub) {
  1050. X    size_t lenpat, lensub, lenstr;
  1051. X
  1052. X    assert(str != NULL);
  1053. X    assert(pat != NULL);
  1054. X    assert(*pat != '\0');
  1055. X    assert(sub != NULL);
  1056. X
  1057. X    str = strstr(str, pat);
  1058. X    if (str == NULL)
  1059. X        return NULL;
  1060. X
  1061. X    lenstr = strlen(str);
  1062. X    lenpat = strlen(pat);
  1063. X    lensub = strlen(sub);
  1064. X
  1065. X    /* make room for substituted string, or remove slack after it */
  1066. X    if (lensub != lenpat)
  1067. X        memmove(str + lensub, str + lenpat, lenstr + 1 - lenpat);
  1068. X
  1069. X    memcpy(str, sub, lensub);
  1070. X    return str + lensub;
  1071. X}
  1072. SHAR_EOF
  1073. chmod 0644 ./strutil/strsub.c || echo "restore of ./strutil/strsub.c fails"
  1074. echo "x - extracting ./strutil/strtabify.3 (Text)"
  1075. sed 's/^X//' << 'SHAR_EOF' > ./strutil/strtabify.3 &&
  1076. X.\" part of publib
  1077. X.\" "@(#)publib-strutil:strtabify.3,v 1.1 1994/06/20 20:30:39 liw Exp"
  1078. X.\"
  1079. X.TH STRTABIFY 3 "C Programmer's Manual" Publib "C Programmer's Manual"
  1080. X.SH NAME
  1081. Xstrtabify \- convert runs of spaces and tabs to tabs
  1082. SHAR_EOF
  1083. echo "End of part 6"
  1084. echo "File ./strutil/strtabify.3 is continued in part 7"
  1085. echo "7" > s2_seq_.tmp
  1086. exit 0
  1087.