ときどきの雑記帖 RE* (新南口)
星巡る方舟
新宿西口
小田急百貨店、新宿店本館の営業を2022年9月で終了へ 50年以上親しまれた新宿西口のランドマークが消える - ねとらぼ
渋谷の東急百貨店(の東横店)もそうだけど、工事が大変そうだなあ。 そういえば新宿駅を出てすぐの踏切ってどうにもならない感じ (何をどう動かせば。という話になるような)?
- 小田急新宿駅の踏切です(ほぼひとりごと(3月22日(金))|岡田 昭彦 (Akihiko Okada)|note
- 小田急線の新宿駅の近くに踏切がありますよね。なんでいまどき踏切があるんですか?… - Yahoo!知恵袋
- 都心の踏切を見に行こう
CD/DVD レンタル
蔦屋書店・TSUTAYA 74店展開のトップカルチャー、レンタル事業撤退へ - AV Watch
Hさん
これにはちょっと驚いた。 怖いもの見たさでどんなものか確かめてみたい気が少々。
7/16先行販売『より速く強力なWebアプリ実現のためのWebAssmblyガイドブック』#カットシステム (978-4-87783-488-3)日向俊二 著◆「#アプリ開発 」棚にて展開中!本書を活用してWebAssmblyプログラミングの世界をのぞいてみてください。#WebAssmbly pic.twitter.com/G4vYMezMYR
— 書泉ブックタワーコンピュータ書【営業時間11:00~20:00】 (@shosen_bt_pc) July 16, 2021
getopt
BSDのgetopt のつづき。
- 4.4BSD-Lite2/getopt.3 at 50587b00e922225c62f1706266587f435898126d ・ sergev/4.4BSD-Lite2
- 4.4BSD-Lite2/getopt.c at master ・ sergev/4.4BSD-Lite2
- 4.4BSD-Lite2/getopt.c at 50587b00e922225c62f1706266587f435898126d ・ sergev/4.4BSD-Lite2
- 4.4BSD-Lite2/getopt.c at 50587b00e922225c62f1706266587f435898126d ・ sergev/4.4BSD-Lite2
4.4BSD-Lite2 のリポジトリで getoptを検索すると上に挙げたものを含め色々引っかかるけど その中から 4.4BSD-Lite2/getopt.c at master · sergev/4.4BSD-Lite2 を選んだ。短いので丸ごと。
/*
* Copyright (c) 1987, 1993, 1994
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)getopt.c 8.3 (Berkeley) 4/27/95";
#endif /* LIBC_SCCS and not lint */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int opterr = 1, /* if error message should be printed */
optind = 1, /* index into parent argv vector */
optopt, /* character checked for validity */
optreset; /* reset getopt */
char *optarg; /* argument associated with option */
#define BADCH (int)'?'
#define BADARG (int)':'
#define EMSG ""
/*
* getopt --
* Parse argc/argv argument vector.
*/
int
getopt(nargc, nargv, ostr)
int nargc;
char * const *nargv;
const char *ostr;
{
extern char *__progname;
static char *place = EMSG; /* option letter processing */
char *oli; /* option letter list index */
if (optreset || !*place) { /* update scanning pointer */
optreset = 0;
if (optind >= nargc || *(place = nargv[optind]) != '-') {
place = EMSG;
return (-1);
}
if (place[1] && *++place == '-') { /* found "--" */
++optind;
place = EMSG;
return (-1);
}
} /* option letter okay? */
if ((optopt = (int)*place++) == (int)':' ||
!(oli = strchr(ostr, optopt))) {
/*
* if the user didn't specify '-' as an option,
* assume it means -1.
*/
if (optopt == (int)'-')
return (-1);
if (!*place)
++optind;
if (opterr && *ostr != ':')
(void)fprintf(stderr,
"%s: illegal option -- %c\n", __progname, optopt);
return (BADCH);
}
if (*++oli != ':') { /* don't need argument */
optarg = NULL;
if (!*place)
++optind;
}
else { /* need an argument */
if (*place) /* no white space */
optarg = place;
else if (nargc <= ++optind) { /* no arg */
place = EMSG;
if (*ostr == ':')
return (BADARG);
if (opterr)
(void)fprintf(stderr,
"%s: option requires an argument -- %c\n",
__progname, optopt);
return (BADCH);
}
else /* white space */
optarg = nargv[optind];
place = EMSG;
++optind;
}
return (optopt); /* dump back option letter */
}
やはりGNUのものとは違って、ostr(getoptの第三引数)の先頭の文字に 特別な意味や役割は持たせていないようだ。
} /* option letter okay? */
if ((optopt = (int)*place++) == (int)':' ||
!(oli = strchr(ostr, optopt))) {
ここで:
かどうかを見ているのが気になるけどなんだろうこれ。
あるオプションが引数を取るかどうかはostrを見ればわかるのだけど、
ここで見ているのはplace、つまりはコマンドライン引数の方(argv[]のどれか)だし。
後続の部分を読むと、結局BADCHを返すことになるようだけど。
glob zsh 5
とりあえずglobルーチン全体の入り口っぽい zglobから追いかけていくか。 と思ったが結構長いなこの関数。
長い関数の中でも長いループがあるようなので、 とりあえずループの手前まで。
/* Main entry point to the globbing code for filename globbing. *
* np points to a node in the list which will be expanded *
* into a series of nodes. */
/**/
void
zglob(LinkList list, LinkNode np, int nountok)
{
struct qual *qo, *qn, *ql;
LinkNode node = prevnode(np);
char *str; /* the pattern */
int sl; /* length of the pattern */
Complist q; /* pattern after parsing */
char *ostr = (char *)getdata(np); /* the pattern before the parser */
/* chops it up */
int first = 0, end = -1; /* index of first match to return */
/* and index+1 of the last match */
struct globdata saved; /* saved glob state */
int nobareglob = !isset(BAREGLOBQUAL);
int shortcircuit = 0; /* How many files to match; */
/* 0 means no limit */
if (unset(GLOBOPT) || !haswilds(ostr) || unset(EXECOPT)) {
if (!nountok)
untokenize(ostr);
return;
}
save_globstate(saved);
str = dupstring(ostr);
uremnode(list, np);
/* quals will hold the complete list of qualifiers (file static). */
quals = NULL;
/*
* qualct and qualorct indicate we have qualifiers in the last
* alternative, or a set of alternatives, respectively. They
* are not necessarily an accurate count, however.
*/
qualct = qualorct = 0;
/*
* colonmod is a concatenated list of all colon modifiers found in
* all sets of qualifiers.
*/
colonmod = NULL;
/* The gf_* flags are qualifiers which are applied globally. */
gf_nullglob = isset(NULLGLOB);
gf_markdirs = isset(MARKDIRS);
gf_listtypes = gf_follow = 0;
gf_noglobdots = unset(GLOBDOTS);
gf_numsort = isset(NUMERICGLOBSORT);
gf_sorts = gf_nsorts = 0;
gf_pre_words = gf_post_words = NULL;
/* Check for qualifiers */
while (!nobareglob ||
(isset(EXTENDEDGLOB) && !zpc_disables[ZPC_HASH])) {
変数の宣言と初期化。それと諸々の設定と。
ループ手前のコメントにCheck for qualifiers
とあるけど
qualifier ってのはこの辺
zsh の分かりにくい記号、用語のまとめ - Qiita
にも説明のあるやつか。
For example, the following piece of filename generation code with the EXTENDED_GLOB option:
print -r -- *.c(#q:s/#%(#b)s(*).c/'S${match[1]}.C'/)
うわ、コード読むのめんどくさそう。
再帰globパターン **/ の元祖
今回調べていたときに偶然遭遇したのでメモ。
- 再帰globパターン **/ の元祖は zsh なのか、調べてみた - hkoba blog
- posting of zsh to alt.sources
- zsh - a ksh/tcsh-like shell (part 1 of 8)