From: Eli Zaretskii <eliz@gnu.org>
To: Stefan Kangas <stefan@marxist.se>
Cc: shuguang79@qq.com, larsi@gnus.org, 50752@debbugs.gnu.org
Subject: bug#50752: 28.0.50; easy-menu-define lowers the menu-bar key
Date: Tue, 19 Oct 2021 14:43:28 +0300 [thread overview]
Message-ID: <83sfwxck9r.fsf@gnu.org> (raw)
In-Reply-To: <CADwFkmnoiyzyQv-vbDmWkjTgcTsPOpUU3=on4JpX7CLkXfaZJg@mail.gmail.com> (message from Stefan Kangas on Mon, 18 Oct 2021 20:22:18 -0700)
> From: Stefan Kangas <stefan@marxist.se>
> Date: Mon, 18 Oct 2021 20:22:18 -0700
> Cc: Eli Zaretskii <eliz@gnu.org>, Shuguang Sun <shuguang79@qq.com>, 50752@debbugs.gnu.org
>
> If anyone has any preferences or further ideas here, that would be much
> appreciated, otherwise I'll keep investigating.
>
> The attached patch is what I have so far. It's obviously not yet
> finished, but all tests pass except for the one for "I->i" conversion in
> the Turkish language environment.
Don't give up, you are close.
> + memcpy (dst, SSDATA (lc_key), SBYTES (lc_key));
> + for (int i = 0; i < SBYTES (lc_key); ++i)
> + {
> + if (*(dst + i) == ' ')
> + *(dst + i) = '-';
> + }
If you want to use an index to walk the string data, as you did above,
please use dst[i] instead of *(dst + i); the latter is correct, but
ugly and un-C-ish. Or you could use a pointer to walk, like this:
unsigned char *p = dst, *dst_end = dst + SBYTES (lc_key);
for ( ; p < dst_end; p++)
{
if (*p == ' ')
*p = '-';
}
> > We could use the equivalent of
> >
> > (get-char-code-property ?I 'lowercase)
> >
> > If the above returns nil, it means the lower-case variant is the
> > character itself.
> >
> > In C, this means to use uniprop_table, like bidi.c and casefiddle.c
> > do. This accesses the database generated from UnicodeData.txt.
>
> I didn't try this approach, mostly because it sounds more difficult to
> implement than what Lars said. I think? Wouldn't it amount to
> basically re-implementing Fdowncase? Sorry, I didn't look too closely
> at this. Perhaps this would be the better approach.
It shouldn't be hard. You need to call uniprop_table to get a
char-table:
Lisp_Object unicode_case_table = uniprop_table (intern ("lowercase"));
which you then reference with
int low_ch = XFIXNUM (CHAR_TABLE_REF (unicode_case_table, ch));
to get the codepoint of the lower-case character that corresponds to
the (possibly upper-case) character whose codepoint is CH. Then
downcasing a string boils down to a loop that fetches characters one
by one with fetch_string_char_advance and then stores the lower-case
characters, obtained as above, with CHAR_STRING. (It's a bit more
complicated than that, because CHAR_TABLE_REF can return nil for the
characters that are either already lower-case or don't have case
variants. And the uniprop_table call should be done once, at startup
time, or upon first usage, and stored in a staticpro'd variable, see
bidi_initialize for an example.)
next prev parent reply other threads:[~2021-10-19 11:43 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-23 8:39 bug#50752: 28.0.50; easy-menu-define lowers the menu-bar key Shuguang Sun via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-09-23 17:15 ` Juri Linkov
2021-09-23 21:45 ` Lars Ingebrigtsen
2021-10-12 22:22 ` Stefan Kangas
2021-10-13 11:28 ` Lars Ingebrigtsen
2021-10-13 11:59 ` Eli Zaretskii
2021-10-13 12:04 ` Lars Ingebrigtsen
2021-10-13 12:19 ` Stefan Kangas
2021-10-13 12:58 ` Lars Ingebrigtsen
2021-10-13 15:26 ` Stefan Kangas
2021-10-13 15:42 ` Lars Ingebrigtsen
2021-10-19 3:22 ` Stefan Kangas
2021-10-19 3:40 ` Lars Ingebrigtsen
2021-10-19 3:52 ` Lars Ingebrigtsen
2021-10-19 11:56 ` Eli Zaretskii
2021-10-19 12:07 ` Lars Ingebrigtsen
2021-10-19 12:17 ` Lars Ingebrigtsen
2021-10-19 12:37 ` Eli Zaretskii
2021-10-19 12:45 ` Lars Ingebrigtsen
2021-10-19 13:24 ` Lars Ingebrigtsen
2021-10-19 16:01 ` Eli Zaretskii
2021-10-19 15:41 ` Eli Zaretskii
2021-10-19 15:57 ` Lars Ingebrigtsen
2021-10-19 16:12 ` Eli Zaretskii
2021-10-19 16:15 ` Lars Ingebrigtsen
2021-10-19 16:21 ` Lars Ingebrigtsen
2021-10-19 16:30 ` Eli Zaretskii
2021-10-19 17:12 ` Lars Ingebrigtsen
2021-10-19 17:37 ` Eli Zaretskii
2021-10-19 18:21 ` Lars Ingebrigtsen
2021-10-20 11:28 ` Eli Zaretskii
2021-10-20 11:55 ` Glenn Morris
2021-10-24 20:11 ` Stefan Kangas
2021-10-25 13:06 ` Lars Ingebrigtsen
2021-10-25 13:19 ` Eli Zaretskii
2021-10-25 13:21 ` Lars Ingebrigtsen
2021-10-25 13:51 ` Eli Zaretskii
2021-10-25 13:55 ` Lars Ingebrigtsen
2021-10-25 14:12 ` Eli Zaretskii
2021-10-26 8:38 ` Stefan Kangas
2021-10-26 13:04 ` Eli Zaretskii
2021-10-26 20:24 ` Stefan Kangas
2021-10-27 14:00 ` Eli Zaretskii
2021-10-28 5:29 ` Stefan Kangas
2021-10-28 7:33 ` Eli Zaretskii
2021-10-28 8:06 ` Stefan Kangas
2021-10-28 9:35 ` Eli Zaretskii
2021-10-28 10:49 ` Stefan Kangas
2021-10-28 12:49 ` Eli Zaretskii
2021-10-28 20:44 ` Stefan Kangas
2021-10-21 2:45 ` Lars Ingebrigtsen
2021-10-21 7:26 ` Eli Zaretskii
2021-10-21 13:04 ` Lars Ingebrigtsen
2021-10-20 7:45 ` Lars Ingebrigtsen
2021-10-20 12:24 ` Eli Zaretskii
2021-10-19 11:43 ` Eli Zaretskii [this message]
2021-10-19 21:54 ` Stefan Kangas
2021-10-20 12:59 ` Eli Zaretskii
2021-10-13 16:09 ` Eli Zaretskii
2021-10-15 5:59 ` Eli Zaretskii
2021-10-15 18:34 ` Stefan Kangas
2021-10-19 3:18 ` Stefan Kangas
2021-09-23 22:28 ` Glenn Morris
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=83sfwxck9r.fsf@gnu.org \
--to=eliz@gnu.org \
--cc=50752@debbugs.gnu.org \
--cc=larsi@gnus.org \
--cc=shuguang79@qq.com \
--cc=stefan@marxist.se \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).